HDU 3215 数学题

The first place of 2^n

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 541    Accepted Submission(s): 237


Problem Description
LMY and YY are mathematics and number theory lovers. They like to find and solve interesting mathematic problems together. One day LMY calculates 2n one by one, n=0, 1, 2,… and writes the results on a sheet of paper: 1,2,4,8,16,32,64,128,256,512,1024,……

LMY discovers that for every consecutive 3 or 4 results, there must be one among them whose first digit is 1, and comes to the conclusion that the first digit of 2n isn’t evenly distributed between 1 and 9, and the number of 1s exceeds those of others. YY now intends to use statistics to prove LMY’s discovery.
 

Input
Input consists of one or more lines, each line describing one test case: an integer N, where 0≤N≤10000.

End of input is indicated by a line consisting of -1.
 

Output
For each test case, output a single line. Each line contains nine integers. The i th integer represents the number of js satisfying the condition that 2 j begins with i (0≤j≤N).
 

Sample Input
  
0 1 3 10 -1
 

Sample Output
  
1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 1 0 4 2 1 1 1 1 0 1 0
 

Source
 

先吐槽下 奶茶和强东, 告诉我这不算真的, 否则清华男怎么活。。。。。。。
题目大意: 
        记录2^0  到 2^n 之间  最左边  的数字 出现的次数  可以知道  最左边的数字 无非是1 ~ 9 因此只要哦论证 他们不是均匀evenly分布,只要打印出结果即可

解题方法: 
              数据结构  需要 一个数组来存储1~ 9 出现的次数
              算法: 判断 最左边的数字是几?
              因为 2^ N 取对数后的 小数部分会出现最左边的数....
             这里要注意的是精度的问题 。。。。eps 1.0e-6 
     具体的这里解释一下 :
                 2^n = sum
                   u= log10(sum)  = n*log10(2);
                     而 sum的最左边的数肯定是 u= log10(sum) 的小数部分产生的 举个栗子u= 3.1234 的整数部分 不就是 3 还原后就是 1000
     某个数乘以1000 肯定移位了
     因此 就是最左边的数产生于u 的小数部分 。。。这里要注意的就是加上精度

              这里采用打表的方式进行求解 ,从头到尾, 把所有的值都计算出结果 ,以后用到的话只要调用就行了
             而且这里采用的是二维数组 记录  代码是看了其他博客写的,自己没什么改进,说来惭愧  电子实习刚结束  以后会多用点心写。。。
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
#define eps 1.0e-6

int ans[10005][13];
void  init()
{
    int i , j, mm;
    double  in, re = log10((double)2), cu;//in 表示 小数部分 re 表示要连续乘的部
    ans[0][1] = 1;
    for(j = 1; j < 10001; j++)
    {//从2^0 开始算
        for(i = 1; i < 10; i++)
        {
             ans[j][i] = ans[j-1][i]; //将所有的初始值赋值为1 这个保证来每隔都是从 1开始计算
        }
        cu = j*re;
        in = cu - (int)cu;
        mm = (int)(pow((double)10, (double)in) + eps);
        ans[j][mm]++;
    }
}
int main()
{   //解题方法 要求首字母  x = 2^n 的首字母  先取对数  lg(x) = n*lg(2)
    //这里采用打表的方法
    int i, j;
    int n;
    int  mm;  //用来记录答案的
    while(cin>>n)
    {
        init();
        if(n == -1) return 0;
        for(i = 1; i <= 9; i++)
        {
            printf(i == 9?"%d\n":"%d ", ans[n][i]);//这个输出挺巧妙的,方便
        }
    }
    return 0;
}



wangxiaoming CSDN认证博客专家 架构 Spring Boot Redis
博客是很好的总结和记录工具,如果有问题,来不及回复,关注微信公众号:程序员开发者社区,获取我的联系方式,向我提问,也可以给我发送邮件,联系 1275801617@qq.com
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页
实付 19.89元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值