首先 这个题的答案为:18446744073709551615
这个题的【置顶加精】【优质题解】答案18446744073709551616是错误的
因为1+2+4+…………,他肯定是一个奇数,怎么可能是一个偶数呢
其次,这个题的样例输出18446744073709552000也是错误的
那么,我们如何得出正确的结果呢?
首先,这个题的解题思路很简单,就是常规的循环加和,但是因为最后一个数字是2^63次方很大,常用的int存放不下,那么我们就需要用其他方法。
对于任意大的数,数组是最好的解决办法,这是 【花露水和暖壶】关于数组表示大数的解决方案,可以看看 数组表示大数
对于不是非常大的数,其实我们也是可以使用double ,double的有效数字为15-16位,用来存15位及以内的整数是没问题的,超过了的话,它只对前15位数字的有效性进行保证,后面的就不保证了。
那么对于这个题并不适用,需要注意。
这里我放一下 数据类型取值范围及位数图标
图表:C/C++基础数字类型的取值范围
类型 取值范围 位数
unsigned int 0~4294967295 10位
int 2147483648~2147483647 10位
unsigned long 0~4294967295 10位
long 2147483648~2147483647 10位
long long -9223372036854775808~9223372036854775807 19位
unsigned long long 0~18446744073709551615 20位
__int64 -9223372036854775808~9223372036854775807 19位
unsigned __int64 0~18446744073709551615 20位
参考代码:
#include<stdio.h> int main() { int a[100]= {0}; //存放加和的数组,每位对应一个数字 0-99分别为低位到高位 int b[100]= {1,0}; //存放每次的数字 ,每位对应一个数字 0-99分别为低位到高位 //这里我直接将第一个格子的1先放进来了 int temp1,temp2; int i,j,flag1,flag2; //flag1,flag2为存放进位,2个数字相加,进位最大只有1 for( i =1; i<=64; i++) //从第一个格子到64个格子,进行累加 { flag1=flag2=0; //每次累加前将进位置0 for( j=0; j<100; j++) //将b[100]里面的数字加到a[100]里面去 { temp1 = a[j]+b[j]+flag1; //将每一位进行加和,并将上一位有进位的加进去 a[j]=temp1%10; //若大于等于10,则取个位 if(flag1) flag1=0; //将进位置0 flag1=temp1/10; //取这一位的进位,0或者1 } for( j=0; j<100; j++) //计算下一个格子 方法跟上面累加相同 { temp2 = 2*b[j]+flag2; b[j]=temp2%10; if(flag2) flag2=0; flag2=temp2/10; } } //结果输出 for( i=99; i>=0; i--) // 因为初始化时是从低到高位存入的,那么取出时因倒叙取出 if(a[i]!=0) //100位太长,需要将高位没意义的0全去掉 { for(j=i; j>=0; j--) printf("%d",a[j]); break; } return 0; }
观察代码,还可以优化一下
#include<stdio.h> int main() { int a[100]= {0}; int b[100]= {1,0}; int temp1,temp2; int i,j,flag1,flag2; for( i =1; i<=64; i++) { flag1=flag2=0; for( j=0; j<100; j++) { temp1 = a[j]+b[j]+flag1; a[j]=temp1%10; if(flag1) flag1=0; flag1=temp1/10; //并不是所有的相同for循环都能合并 //这里因为是先计算加和,已经使用了b[j],而且后面不再使用 //所以可以对b[j]进行操作 temp2 = 2*b[j]+flag2; b[j]=temp2%10; if(flag2) flag2=0; flag2=temp2/10; } } //输出计算结果 for( i=99; i>=0; i--) if(a[i]!=0) { for(j=i; j>=0; j--) printf("%d",a[j]); break; } return 0; }
0.0分
6 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复