S1E6
本帖最后由 白牡丹秀色可餐 于 2019-8-10 00:57 编辑#include<stdio.h>
#include<math.h>
int main()
{
unsigned int result;
int i;
i = 0;
while (i<=63)
{
result = result^2,
i = i+1;
if (i>63)
break;
}
result = result/25000;
printf("舍罕王需要付给达依尔%dkg麦子",result);
return 0;
}
请问这个代码有什么错误吗?
我把63改为64后result的最终值依旧没有什么变化
#include<stdio.h>
#include<math.h>
int main()
{
unsigned int result;
int i;
result = 2;
i = 0;
while (i<=63)
{
result = result^i,
i = i+1;
if (i>63)
break;
}
result = result/25000;
printf("舍罕王需要付给达依尔%ukg麦子",result);
return 0;
}
还有这一个的结果是0,该怎么改? 语法应该没啥错误,有啥报错的先贴报错代码,第二个为0是因为你一直按位与 0 之后一直是0,所以result一直是0 ,不知道你想要干啥 #include<stdio.h>
#include <stdlib.h>
int main()
{
long result, re=0;
int i,j;
result = 2;
for(i=1;i<=63;i++)
{
for(j=1;j<i;j++)
{
re = result*result;
}
result += re;
}
result = result/25000;
printf("舍罕王需要付给达依尔 %u kg麦子\n",result);
system("pause");
}
改成这样应该就没问题了。不知道你的意思是不是每次运算第几次的次方再累加,最后除以25000。
在这里我记得没有次方的“^”操作,所以我们想要做到这个效果则需要用循环来把每次与自己相乘的结果全乘起来。并且math也可以不引用
因为是要累加,所以有2个循环:里层的是算每次次方相乘的结果;外层是把每次相乘过后的结果累加。
另外建议你使用long型来做这个,数比较大 没有结果的话是不用返回0的,要不当然是0喽 本帖最后由 jackz007 于 2019-8-10 10:37 编辑
这个代码的最核心的问题是数据类型:
unsigned int result ;
因为 result 的值要达到 2 ^ 63,这已经远远超出一个 32 位 int 所能达到的最大值 2 ^ 32- 1,即便是在 64 位的 Linux 系统下使用 gcc 编译,也得使用:
unsigned long result ;
来进行定义,如果是在 Windows 系统下使用 gcc 编译,那也需要这样来定义:
unsigned long long result ;
显示数值也不可以用 "%d" ,必须使用"%I64u"。 #include<stdio.h>
int main()
{
unsigned long long d , result ;
int i , k ;
for(result = 0 , i = 0 ; i < 64 ; i ++) {
for(d = 1 , k = 0 ; k < i ; k ++) d = d * 2 ;
result += d ;
}
printf("\n") ;
printf("舍罕王需要付给达依尔的麦子数量为:\n") ;
printf(" %20I64u 粒\n" , result) ;
printf(" %20I64u kg\n" , result / 25000) ;
printf("\n") ;
}
此代码采用 tdm-gcc 5.1.0 x86 成功编译,以下是运行实况:
C:\Bin>sh
舍罕王需要付给达依尔的麦子数量为:
18446744073709551615 粒
737869762948382 kg
C:\Bin>
从运行实况可以看出,result 的值(麦子总粒数)实际上就是 64 位无符号长整型的最大值 2 ^ 64 - 1,如果用十六进制数表示就是 0xffffffffffffffff。
页:
[1]