Hduoj1041【数学】

来源:互联网 发布:网络安全法手抄报内容 编辑:程序博客网 时间:2024/05/19 18:43
/*Computer TransformationTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6626    Accepted Submission(s): 2408Problem DescriptionA sequence consisting of one digit, the number 1 is initially written into a computer. At each successive time step, the computer simultaneously tranforms each digit 0 into the sequence 1 0 and each digit 1 into the sequence 0 1. So, after the first time step, the sequence 0 1 is obtained; after the second, the sequence 1 0 0 1, after the third, the sequence 0 1 1 0 1 0 0 1 and so on. How many pairs of consequitive zeroes will appear in the sequence after n steps? InputEvery input line contains one natural number n (0 < n ≤1000).  OutputFor each input n print the number of consecutive zeroes pairs that will appear in the sequence after n steps.Sample Input23 Sample Output11 SourceSoutheastern Europe 2005 RecommendJGShining   |   We have carefully selected several similar problems for you:  1006 1143 1200 1063 1046 */#include<stdio.h>#include<string.h>int g[301], f[301];//g[i]表示第i步所拥有的1的个数,f[i]表示第i步所拥有的0的对数 //第1000个数接近300位 int main(){int n;while(scanf("%d", &n) != EOF){memset(f, 0, sizeof(f));memset(g, 0, sizeof(g));f[0] = 0;//the firstg[0] = 1;//the secondif(n == 1 || n == 2){printf("%d\n", n-1);continue;}for(int i = 3; i <= n; ++i){int temp;for(int j = 0; j < 301; ++j)//f*2{f[j] *= 2;temp = f[j] + g[j];f[j] = g[j];g[j] = temp;}for(int j = 0; j < 301; ++j){if(g[j] > 9){g[j+1] += g[j]/10;g[j] %= 10;}}}for(int i = 301; i >= 0; --i){if(g[i] != 0){for(int j = i; j >= 0; --j)printf("%d", g[j]);printf("\n");break; }}}return 0;}

题意:给出一个数1,每进行一次操作,数列中的1会变成01, 而0会变成10,求经过n步操作后,数列中00的对数。

思路:这个是个规律题,通过推敲可以发现f【i】 = f【i-1】 + f【i-2】*2,然后就是大数相加,其次要把握好第1000个数的长度是300,控制相加的上限,避免超时。

0 0
原创粉丝点击