鱼C论坛

 找回密码
 立即注册
查看: 1656|回复: 5

[已解决]S1E6

[复制链接]
发表于 2019-8-10 00:51:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 白牡丹秀色可餐 于 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,该怎么改?
最佳答案
2019-8-10 09:32:02
  1. #include<stdio.h>
  2. #include <stdlib.h>

  3. int main()
  4. {
  5.         long result, re=0;
  6.         int i,j;
  7.         result = 2;
  8.         for(i=1;i<=63;i++)
  9.                 {
  10.                         for(j=1;j<i;j++)
  11.                         {
  12.                                 re = result*result;
  13.                         }
  14.                         result += re;
  15.                 }
  16.         result = result/25000;
  17.         printf("舍罕王需要付给达依尔 %u kg麦子\n",result);
  18.                 system("pause");
  19. }
复制代码


改成这样应该就没问题了。不知道你的意思是不是每次运算第几次的次方再累加,最后除以25000。

在这里我记得没有次方的“^”操作,所以我们想要做到这个效果则需要用循环来把每次与自己相乘的结果全乘起来。并且math也可以不引用

因为是要累加,所以有2个循环:里层的是算每次次方相乘的结果;外层是把每次相乘过后的结果累加。

另外建议你使用long型来做这个,数比较大
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-8-10 09:08:10 | 显示全部楼层
语法应该没啥错误,有啥报错的先贴报错代码,第二个为0是因为你一直按位与 0   之后一直是0,所以result一直是0   ,不知道你想要干啥
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-10 09:32:02 | 显示全部楼层    本楼为最佳答案   
  1. #include<stdio.h>
  2. #include <stdlib.h>

  3. int main()
  4. {
  5.         long result, re=0;
  6.         int i,j;
  7.         result = 2;
  8.         for(i=1;i<=63;i++)
  9.                 {
  10.                         for(j=1;j<i;j++)
  11.                         {
  12.                                 re = result*result;
  13.                         }
  14.                         result += re;
  15.                 }
  16.         result = result/25000;
  17.         printf("舍罕王需要付给达依尔 %u kg麦子\n",result);
  18.                 system("pause");
  19. }
复制代码


改成这样应该就没问题了。不知道你的意思是不是每次运算第几次的次方再累加,最后除以25000。

在这里我记得没有次方的“^”操作,所以我们想要做到这个效果则需要用循环来把每次与自己相乘的结果全乘起来。并且math也可以不引用

因为是要累加,所以有2个循环:里层的是算每次次方相乘的结果;外层是把每次相乘过后的结果累加。

另外建议你使用long型来做这个,数比较大
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-10 09:33:22 | 显示全部楼层
没有结果的话是不用返回0的,要不当然是0喽
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-10 10:33:48 From FishC Mobile | 显示全部楼层
本帖最后由 jackz007 于 2019-8-10 10:37 编辑

    这个代码的最核心的问题是数据类型:
  1.         unsigned int result ;
复制代码

     因为 result 的值要达到 2 ^ 63,这已经远远超出一个 32 位 int 所能达到的最大值 2 ^ 32  - 1,即便是在 64 位的 Linux 系统下使用 gcc 编译,也得使用:
  1.         unsigned long result ;
复制代码

来进行定义,如果是在 Windows 系统下使用 gcc 编译,那也需要这样来定义:
  1.         unsigned long long result ;
复制代码


      显示数值也不可以用 "%d" ,必须使用"%I64u"。

评分

参与人数 1荣誉 +1 收起 理由
df3379 + 1 这个解答完美又详细

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-8-10 12:23:53 | 显示全部楼层
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         unsigned long long d , result                       ;
  5.         int i , k                                           ;
  6.         for(result = 0 , i = 0 ; i < 64 ; i ++) {
  7.                 for(d = 1 , k = 0 ; k < i ; k ++) d = d * 2 ;
  8.                 result += d                                 ;
  9.         }
  10.         printf("\n")                                        ;
  11.         printf("舍罕王需要付给达依尔的麦子数量为:\n")       ;
  12.         printf("        %20I64u 粒\n" , result)             ;
  13.         printf("        %20I64u kg\n" , result / 25000)     ;
  14.         printf("\n")                                        ;
  15. }
复制代码


        此代码采用 tdm-gcc 5.1.0 x86 成功编译,以下是运行实况:
  1. C:\Bin>sh

  2. 舍罕王需要付给达依尔的麦子数量为:
  3.         18446744073709551615 粒
  4.              737869762948382 kg


  5. C:\Bin>
复制代码


        从运行实况可以看出,result 的值(麦子总粒数)实际上就是 64 位无符号长整型的最大值 2 ^ 64 - 1,如果用十六进制数表示就是 0xffffffffffffffff。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-12 14:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表