S1E6课后习题代码求解
#include <stdio.h>#include <math.h>
int main()
{
unsigned long long result = 0;
for(int i=0; i<64; i++){
result += pow(2, i);
}
printf("result = %u\n", result);
return 0;
}
本帖最后由 村里小黑 于 2021-12-31 16:42 编辑
printf的类型为llu
超出定义的变量的长度了,逻辑没问题 printf("result = %u\n", result);把这里的%u改成llu就好了https://xxx.ilovefishc.com/forum/202112/09/164943hkpkq7bebk79qkf7.png.thumb.jpg 阿萨德按时 发表于 2021-12-31 16:40
printf("result = %u\n", result);把这里的%u改成llu就好了
不行呢,好像最大只能32位,是软件问题吗 本帖最后由 阿萨德按时 于 2021-12-31 17:01 编辑
#include <stdio.h>
#include <math.h>
int main()
{
double result = 0;
for(int i=0; i<64; i++){
result += pow(2, i);
}
printf("result = %f\n", result);
return 0;
}小伊布 发表于 2021-12-31 16:42
不行呢,好像最大只能32位,是软件问题吗
还是超出了范围。。改成上面那那样就可以了https://xxx.ilovefishc.com/forum/201512/27/205729vnwzeadn08gx9h89.png 但是用小甲鱼的代码可以,我这个不行,为什么呢 阿萨德按时 发表于 2021-12-31 16:57
还是超出了范围。。改成上面那那样就可以了
这个可以,但是小甲鱼代码的也是整型,可以运行,我写的这个不行 本帖最后由 傻眼貓咪 于 2021-12-31 18:14 编辑
方法 1#include <stdio.h>
#include <math.h>
int main(){
unsigned long long result = 0;
for(int i = 0; i < 64; i++){
result += (unsigned long long)pow(2, i); // 注:pow() 返回 double 类型,需要转换成 unsigned long long 类型
}
printf("result = %llu\n", result); // 注:输出类型必须也是 unsigned long long 类型 %llu(此外,在广泛使用 ISO C99 扩展之前,用 %I64u 于 Win32/Win64 平台)
return 0;
}方法 2:位元 XOR 运算符#include <stdio.h>
#include <math.h>
int main()
{
unsigned long long result = 1LL;
for(unsigned long long i = 0; i < 64; i++) result ^= 2LL<<i;
printf("result: %llu\n", result);
return 0;
}方法 3:位元 OR 运算符#include <stdio.h>
#include <math.h>
int main()
{
unsigned long long result = 0;
for(unsigned long long i = 0; i < 64; i++) result |= 1LL<<i;
printf("result: %llu\n", result);
return 0;
}方法 4:数学公式 - 二次方运算
#include <stdio.h>
#include <math.h>
int main()
{
unsigned long long result = (unsigned long long)(pow(2, 64)-1);
printf("result: %llu", result);
return 0;
} 谢谢 本帖最后由 阿萨德按时 于 2022-1-4 09:24 编辑
小伊布 发表于 2021-12-31 17:07
这个可以,但是小甲鱼代码的也是整型,可以运行,我写的这个不行
应该还是取值范围的问题吧。其实我也有点搞不懂了,运算结果应该是18446744073709551616,都是超了范围的,为什么一个显示是0,一个显示是18446744073709551615,应该就是楼上大佬提到的pow运算为double类型导致左右数值类型不一样的问题吧。 傻眼貓咪 发表于 2021-12-31 17:58
方法 1方法 2:位元 XOR 运算符方法 3:位元 OR 运算符方法 4:数学公式 - 二次方运算
还是S1E6这个题目,请问 pow(2,i) 里面没有小数,即便是double类型,为什么在 i = 53 时,出现了计算多出1的情况呀?
为什么利用中间变量的情况就不会发生这种情况呢?#include <stdio.h>
#include <math.h>
int main(){
unsigned long long sum = 0;
unsigned long long n = 0;
unsigned long long temp = 0;
int i;
int k = 0;
for(i = 0;i<64; i++ ){
sum += pow(2,i);
temp = pow(2,i);
n = n + temp;
if(i == 52){
printf("i = %d\n",i);
printf("n = %llu\n",n);
printf("sum = %llu\n",sum);
printf("temp = %llu\n",temp);
}
if(sum != n && k == 0){
k = 1;
printf("i = %d\n",i);
printf("n = %llu\n",n);
printf("sum = %llu\n",sum);
printf("temp = %llu\n",temp);
}
}
printf("一共应给予%llu粒麦子\n",sum);
printf("共%llu公斤麦子\n",sum/25000);
return 0;
}
页:
[1]