鱼C论坛

 找回密码
 立即注册
查看: 1187|回复: 8

[已解决]带你学C带你飞,作业S1E21的第三道编程题

[复制链接]
发表于 2021-12-23 19:31:09 | 显示全部楼层 |阅读模式

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

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

x
这是我的代码,但输出的64 不是1 + 3 +...+15。求助
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.     int count;
  5.     int cube;
  6.     int sum = 0;

  7.     printf("请输入一个整数:\n");
  8.     scanf("%d",&count);

  9.     // // 定义一个二维数组来存储数值
  10.     // int num;
  11.     // for (num = 1;num * num * num < count * count * count;num++)
  12.     // {}
  13.     int n[count][4];
  14.    
  15.     for (int i = 3;i <= count;i++)
  16.     {
  17.         cube = i * i * i;
  18.         for (int j = 1;j < cube;j += 2)
  19.         {
  20.             for (int k = j;k < cube;k += 2)
  21.             {
  22.                 sum += k;
  23.                 if (sum == cube)
  24.                 {
  25.                     // 存储数值
  26.                     n[i - 1][0] = cube;
  27.                     n[i - 1][1] = j;
  28.                     n[i - 1][2] = j + 2;
  29.                     n[i - 1][3] = k;
  30.                     // if (k - j <= 4)
  31.                     // printf("%d = %d + %d + %d\n",cube,j,j+2,k);
  32.                     // else
  33.                     // printf("%d = %d + %d + ... + %d\n",cube,j,j+2,k);
  34.                     goto CONTINUE;
  35.                 }

  36.                 if (sum > cube) // 跳出 循环 还要记得把sum归0
  37.                 {
  38.                     sum = 0;
  39.                     break;
  40.                 }
  41.             }
  42.         }
  43.         CONTINUE:
  44.         ;        // 空语句,继续 i 循环
  45.     }
  46.    
  47.     int b;
  48.     printf("请输入想要打印的范围:\n");
  49.     scanf("%d",&b);

  50.     for (int i = 3;i <= b;i++)
  51.     {
  52.         if (i == 3)
  53.             printf("%d = %d + %d + %d\n",n[i - 1][0],n[i - 1][1],n[i - 1][2],n[i - 1][3]);
  54.         else
  55.             printf("%d = %d + %d ... +%d\n",n[i - 1][0],n[i - 1][1],n[i - 1][2],n[i - 1][3]);
  56.     }
  57.     // printf("%d %d %d",n[4][1],n[4][2],n[4][3]);

  58.     return 0;
  59. }
复制代码
最佳答案
2021-12-23 21:24:07

已修改:
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int n, res, flag, flag2, flag3 = 1;
  5.     char c;
  6.     printf("输入一个整数:");
  7.     scanf("%d", &n);
  8.     int ans[256][256] = {{0}};
  9.     for(int num = 3, x = num*num*num, p = 0; num <= n; num++, p++, x = num*num*num, flag2 = 0){
  10.         for(int i = 1; i < x; i += 2){
  11.             res = flag = 0;
  12.             for(int j = i, k = 0; j < x; j += 2){
  13.                 res += ans[p][k++] = j;
  14.                 if(res == x){
  15.                     flag = flag2 = 1;
  16.                     break;
  17.                 }
  18.                 else if(res > x) break;
  19.             }
  20.             if(flag) break;
  21.         }
  22.         
  23.         if(!flag2){
  24.             printf("经验证,3 ~ %d 之间所有的整数不符合尼科彻斯定理!\n\n", n);
  25.             flag3 = 0;
  26.             break;
  27.         }
  28.     }
  29.     if(flag3) printf("经验证,3 ~ %d 之间所有的整数符合尼科彻斯定理!\n\n", n);
  30.     printf("是否打印所有式子(y/n):");
  31.     while((c = getchar()) != '\n');
  32.     scanf("%c", &c);
  33.     switch(c){
  34.         case 'y':
  35.             for(int i, j, r = i = 0; i < n-2; i++){
  36.                 for(j = 0; ans[i][j] && ans[i][j] != ans[i][j-1]; j++){}
  37.                 if(j > 3) printf("%d^3 == %d == %d + %d + ... + %d", i+3, (i+3)*(i+3)*(i+3), ans[i][0], ans[i][1], ans[i][j-1]);
  38.                 else printf("%d^3 == %d == %d + %d + %d", i+3, (i+3)*(i+3)*(i+3), ans[i][0], ans[i][1], ans[i][2]);
  39.                 printf("\n");
  40.             }
  41.             break;
  42.         case 'n': break;
  43.     }
  44.     return 0;
  45. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-12-23 19:48:27 | 显示全部楼层
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int n, res, arr[256] = {0}, flag;
  5.     printf("输入一个整数:");
  6.     scanf("%d", &n);
  7.     n = n*n*n;
  8.     for(int i = 1; i < n; i += 2){
  9.         res = flag = 0;
  10.         for(int j = i, k = 0; j < n; j += 2){
  11.             res += arr[k++] = j;
  12.             if(res == n){
  13.                 if(k < 4) printf("%d = %d + %d + %d", n , arr[0], arr[1], arr[2]);
  14.                 else printf("%d = %d + %d + ... + %d", n, arr[0], arr[1], arr[k-1]);
  15.                 flag = 1;
  16.             }
  17.             else if(res > n) break;
  18.         }
  19.         if(flag) break;
  20.     }
  21.     return 0;
  22. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-23 19:58:07 | 显示全部楼层

这个只能输出n立方的奇数和,第三题是要把3~n这个范围的数都判定。最后再由用户输入要打印的范围
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-23 20:01:55 | 显示全部楼层

而且这个如果输入的数比较大的话,arr这个数组会不够空间出错。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-23 20:32:01 | 显示全部楼层
Mirex 发表于 2021-12-23 20:01
而且这个如果输入的数比较大的话,arr这个数组会不够空间出错。

好的,我再研究研究
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-23 20:33:52 | 显示全部楼层
傻眼貓咪 发表于 2021-12-23 20:32
好的,我再研究研究

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

使用道具 举报

发表于 2021-12-23 21:24:07 | 显示全部楼层    本楼为最佳答案   

已修改:
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int n, res, flag, flag2, flag3 = 1;
  5.     char c;
  6.     printf("输入一个整数:");
  7.     scanf("%d", &n);
  8.     int ans[256][256] = {{0}};
  9.     for(int num = 3, x = num*num*num, p = 0; num <= n; num++, p++, x = num*num*num, flag2 = 0){
  10.         for(int i = 1; i < x; i += 2){
  11.             res = flag = 0;
  12.             for(int j = i, k = 0; j < x; j += 2){
  13.                 res += ans[p][k++] = j;
  14.                 if(res == x){
  15.                     flag = flag2 = 1;
  16.                     break;
  17.                 }
  18.                 else if(res > x) break;
  19.             }
  20.             if(flag) break;
  21.         }
  22.         
  23.         if(!flag2){
  24.             printf("经验证,3 ~ %d 之间所有的整数不符合尼科彻斯定理!\n\n", n);
  25.             flag3 = 0;
  26.             break;
  27.         }
  28.     }
  29.     if(flag3) printf("经验证,3 ~ %d 之间所有的整数符合尼科彻斯定理!\n\n", n);
  30.     printf("是否打印所有式子(y/n):");
  31.     while((c = getchar()) != '\n');
  32.     scanf("%c", &c);
  33.     switch(c){
  34.         case 'y':
  35.             for(int i, j, r = i = 0; i < n-2; i++){
  36.                 for(j = 0; ans[i][j] && ans[i][j] != ans[i][j-1]; j++){}
  37.                 if(j > 3) printf("%d^3 == %d == %d + %d + ... + %d", i+3, (i+3)*(i+3)*(i+3), ans[i][0], ans[i][1], ans[i][j-1]);
  38.                 else printf("%d^3 == %d == %d + %d + %d", i+3, (i+3)*(i+3)*(i+3), ans[i][0], ans[i][1], ans[i][2]);
  39.                 printf("\n");
  40.             }
  41.             break;
  42.         case 'n': break;
  43.     }
  44.     return 0;
  45. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-24 11:01:42 | 显示全部楼层
谢谢啦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-6 22:57:59 | 显示全部楼层
  1. // 用户输入一个表示范围的最大值 count,程序将测试 3 ~ count 所有的整数是否都符合尼科彻斯定理。
  2. // 暂未解决:整数4的值有问题,n[4][1]。
  3. #include <stdio.h>

  4. int main(void)
  5. {
  6.     int count;
  7.     int cube;
  8.     int sum = 0;

  9.     printf("请输入一个整数:\n");
  10.     scanf("%d",&count);

  11.     // // 定义一个二维数组来存储数值
  12.     // int num;
  13.     // for (num = 1;num * num * num < count * count * count;num++)
  14.     // {}
  15.     int n[count][4];
  16.    
  17.     for (int i = 3;i <= count;i++)
  18.     {
  19.         // printf("a");
  20.         cube = i * i * i;
  21.         for (int j = 1;j < cube;j += 2)
  22.         {
  23.             // printf("b");
  24.             for (int k = j;k < cube;k += 2)
  25.             {
  26.                 // printf("c");
  27.                 sum += k;
  28.                 if (sum == cube)
  29.                 {
  30.                     // 存储数值
  31.                     n[i - 1][0] = cube;
  32.                     n[i - 1][1] = j;
  33.                     n[i - 1][2] = j + 2;
  34.                     n[i - 1][3] = k;
  35.                     // 存储完后还要把sum归零,判断下一个i是否满足
  36.                     sum = 0;
  37.                     // if (k - j <= 4)
  38.                     // printf("%d = %d + %d + %d\n",cube,j,j+2,k);
  39.                     // else
  40.                     // printf("%d = %d + %d + ... + %d\n",cube,j,j+2,k);
  41.                     goto CONTINUE;
  42.                 }

  43.                 if (sum > cube) // 跳出 循环 还要记得把sum归0
  44.                 {
  45.                     sum = 0;
  46.                     break;
  47.                 }
  48.             }
  49.         }
  50.         CONTINUE:
  51.         ;        // 空语句,继续 i 循环
  52.     }
  53.    
  54.     int b;
  55.     printf("请输入想要打印的范围:\n");
  56.     scanf("%d",&b);

  57.     for (int i = 3;i <= b;i++)
  58.     {
  59.         if (i == 3)
  60.             printf("%d = %d + %d + %d\n",n[i - 1][0],n[i - 1][1],n[i - 1][2],n[i - 1][3]);
  61.         else
  62.             printf("%d = %d + %d ... +%d\n",n[i - 1][0],n[i - 1][1],n[i - 1][2],n[i - 1][3]);
  63.     }
  64.     // printf("%d %d %d",n[4][1],n[4][2],n[4][3]);

  65.     return 0;
  66. }
复制代码


我自己的代码也找到了错误的原因。当累加和等于cube时没有把sum归零就进入了下一个循环,所以从这以后的所有数值都会出错。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-5 11:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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