这两个代码算出来结果为啥不一样啊
本帖最后由 清如许 于 2022-9-30 20:46 编辑代码一
#include <stdio.h>
#include <math.h>
int main()
{
unsigned long long int a;
unsigned long long int temp;
unsigned long long int sum;
unsigned long long int b;
for (a=0;a<64;a++)
{
b=pow(2,a);
sum=b+temp;
temp=b;
}
printf("%llu\n",sum);
return 0;
}
代码二
#include <stdio.h>
#include <math.h>
int main()
{
unsigned long long sum = 0;
unsigned long long temp;
int i;
for (i=0; i < 64; i++)
{
temp = pow(2, i);
sum = sum + temp;
}
printf("%llu\n", sum);
return 0;
}
请教各位了 第一个是13835058055282163712第二个是18446744073709551615 本帖最后由 jackz007 于 2022-9-30 20:51 编辑
代码一是错的。
#include <stdio.h>
#include <math.h>
int main()
{
unsigned long long int a , b , temp , sum ;
for (a = 0 ; a < 64 ; a ++) {
b = pow(2 , a) ;
sum = b + temp ; // temp 未赋初值,每个 b 会反复被加 2 次
temp = b ; // 让 temp = b,准备下回再加一次?
}
printf("%I64u\n",sum) ;
return 0;
}
代码二是正确的,有一点需要注意,在 Windows 平台上,显示 64 位整型要服从微软的规矩,scanf()、printf() 的格式描述符要用 "%I64u",不要用 "%lld",除非可以正常显示。 我这运算的结果,两个一样,你的不一样?
jackz007 发表于 2022-9-30 20:48
代码一是错的。
哦哦哦,谢谢大佬,但我百度看变量为赋值的话默认是0啊?
七分君 发表于 2022-9-30 20:50
我这运算的结果,两个一样,你的不一样?
我的不一样5555 七分君 发表于 2022-9-30 20:50
我这运算的结果,两个一样,你的不一样?
第一个是13835058055282163712第二个是18446744073709551615 本帖最后由 jackz007 于 2022-9-30 21:05 编辑
清如许 发表于 2022-9-30 20:50
哦哦哦,谢谢大佬,但我百度看变量为赋值的话默认是0啊?
即便 temp 初值是 0,代码一也是严重错误的。
其实,这道题很简单,根本就没有那么多的是非
#include <stdio.h>
int main(void)
{
unsigned long long int a , b , i , sum ;
for(sum = a = 0 ; a < 64 ; a ++) {
for(b = 1 , i = 0 ; i < a ; i ++) b *= 2 ;
sum += b ;
}
printf("%I64u\n",sum) ;
}
编译、运行实况:
D:\\C>g++ -o x x.c
D:\\C>x
18446744073709551615
D:\\C> jackz007 发表于 2022-9-30 20:54
即便 temp 初值是 0,代码一也是严重错误的。
其实,这道题很简单,根本就没有那么 ...
为什么b会被加2次呢 jackz007 发表于 2022-9-30 20:54
即便 temp 初值是 0,代码一也是严重错误的。
其实,这道题很简单,根本就没有那么 ...
谢谢大佬指点
页:
[1]