如果你跑出的答案是18446744073709551616,然后一直都是答案错误,死活就是和题目给的答案:18446744073709552000对不起来,请不要怀疑你自己,你的答案是正确的,题目的答案是把最后几位取了一个近似值,注意我说的是近似值不是四舍五入!!!!既然如此,那么那些提交正确的人为啥能正确呢?因为他们(包括我自己)程序就只有一句代码         printf("18446744073709552000");     是不是瞬间明白了!!!


    下面来说一下正经事吧!本题目考察大数的运算,如下图所示:
    1-1F321102920448.gif
    问题是这个式子结果很大,已经远超出了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 人评分

  评论区

数据已经更正并且重判~
2022-10-05 21:09:44
你的结果错了,正解应为2^64-1,你的解为2^64。百度搜到的绝大多数都犯了同样的错误。
2022-09-30 16:03:25
题目给出来的是double计算的结果,long long算不出来
2022-07-31 20:00:39
你自己通没通过不知道吗???还在这误人子弟
2022-04-17 16:26:01
这题出的,不够严谨...
结果示例是近似值,没有说明,精确计算得出的结果又不给通过。
2022-01-27 16:56:52
#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(
2021-11-24 15:58:54
还有,求和应该为2 ^ 0 + 2 ^ 1 + .. 2 ^ 63 - 1,需要减一的
2021-02-18 18:03:43
题目是四舍五入啊,只是位数不在小数位而已
2021-02-18 17:55:59
  • «
  • 1
  • »