如果你跑出的答案是18446744073709551616,然后一直都是答案错误,死活就是和题目给的答案:18446744073709552000对不起来,请不要怀疑你自己,你的答案是正确的,题目的答案是把最后几位取了一个近似值,注意我说的是近似值不是四舍五入!!!!既然如此,那么那些提交正确的人为啥能正确呢?因为他们(包括我自己)程序就只有一句代码 printf("18446744073709552000"); 是不是瞬间明白了!!!
下面来说一下正经事吧!本题目考察大数的运算,如下图所示:
问题是这个式子结果很大,已经远超出了int范围,那这可咋整,别担心,我们有两种解决方案:一是数组模拟大数表示;而是使用double来存储这个超级大数,接着往下看:
方案一:数组模拟大数表示,代码如下:代码如果看不懂可以参考我之前的一篇文章 数组表示大数 ,那篇文章中我有详细的讲解,或者是把循环变量64缩小成5,然后debug跑一遍,我保证一遍你就能懂
#include <stdio.h> #include <math.h> int main() { int bigNumber[100] = {0}; bigNumber[0] = 1; for (int i = 0; i < 64; ++i) { for (int j = 0; j < 64; ++j) { bigNumber[j]*=2; } for (int j = 0; j < 64; ++j) { if (bigNumber[j] > 9) { bigNumber[j+1] += 1; bigNumber[j] %= 10; } } } for (int i = 63; i >= 0; --i) { if (bigNumber[i] > 0) { for (int j = i; j >= 0; --j) { printf("%d",bigNumber[j]); } break; } } return 0; }
方案二:使用double类型
#include <stdio.h> #include <math.h> int main(){ double sum = 0; /*定义double型变量sum存放累加和*/ int i; /*使用循环求累加和*/ for( i=1; i<=64; i++ ) sum = sum + pow(2.0, (i-1)); /*注意变量为double型*/ printf("%.0f\n", sum); /*打印结果。%.0f表示只取整数部分*/ return 0; }
很明显这种方式更简单易懂对吧!其实以后遇到超级大数,不妨先试一下double类型,如果double都不满足,那就试一下数组模拟大数吧!
0.0分
26 人评分
这题出的,不够严谨... 结果示例是近似值,没有说明,精确计算得出的结果又不给通过。
王文萱 2023-04-09 16:25:30 |
#include int main(){ long double sum = 0; /*定义double型变量sum存放累加和*/ int i; /*使用循环求累加和*/ for( i=1; i<=64; i++ ) sum = sum + pow(2.0, (i-1)); /*注意变量为double型*/ printf("%.0llf ", sum); /*打印结果。%.0llf表示只取整数部分*/ return 0; }
#include<stdio.h> int main(void){ int total[30]={1}, cell[30]={1}; int i, j; for(i=1;i<64;i++){ for(j=0;j<30;j++) cell[j] *= 2; for(j=0;j<30;j++){ if(cell[j]>=10){ cell[j+1]++; cell[j] = cell[j]%10; } } for(j=0;j<30;j++){ total[j] += cell[j]; if(total[j]>=10){ total[j+1]++; total[j] = total[j]%10; } } for(j=29;j>=0;j--) printf("%d", cell[j]); printf(" "); for(j=29;j>=0;j--) printf("%d", total[j]); putchar('\n'); } for(i=29;i>=0;i--){ if(total[i] != 0){ for(j=i;j>=0;j--) printf("%d", total[j]); break; } } putchar(
还有,求和应该为2 ^ 0 + 2 ^ 1 + .. 2 ^ 63 - 1,需要减一的
C语言训练-角谷猜想 (C语言代码)浏览:1673 |
C语言程序设计教程(第三版)课后习题7.4 (C语言代码)浏览:603 |
2003年秋浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:744 |
【偶数求和】 (C语言代码)浏览:631 |
wu-理财计划 (C++代码)浏览:824 |
C语言程序设计教程(第三版)课后习题6.6 (C++代码)浏览:622 |
Hello, world! (C++代码)浏览:1742 |
C语言程序设计教程(第三版)课后习题9.2 (C语言代码)浏览:555 |
数组与指针的问题浏览:715 |
10月月赛题解浏览:536 |