鱼C论坛

 找回密码
 立即注册
查看: 1140|回复: 19

[已解决]C语言课后作业21动动手第二题求助

[复制链接]
发表于 2021-10-5 14:49:10 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 软大头 于 2021-10-5 16:51 编辑

#include<stdio.h>
#include<math.h>
int main()
{
        bool flag=0;
        int i,j,k,l,n,cubed,sum,count;
        int str[1024];
        j=3;
        i=2;
        printf("请输入一个整数:");
        scanf("%d",&n);
        cubed=n*n*n;
        int result;
        for(i=2;;i++)
        {
                for(j=3;;j=j+2)
                {
                        sum=j*i+i*(i-1);                        //设分解后的第一个奇数是j,一共有i个
                        if(sum>cubed)
                        {
                                break;
                        }
                        else if(sum==cubed)                        //得到j和i
                        {
                                flag=1;
                                break;
                        }
                }
                if(flag)
                {
                        break;
                }
         }
        for(k=0;k<i;k++)
        {
                str[k]=j+2*k;
        }
        printf("%d=",cubed);
        for(l=0;l<i;l++)
        {
                printf("%d,",str[l]);
        }
                printf("\b");
        return 0;
}


屏幕截图 2021-10-05 164933.png
这是我的动动手1的答案,但是同样的方法却在动动手2出问题了??


#include<stdio.h>
#include<math.h>
int main()
{
        bool flag=0;
        int i,j,k,l,n,cubed,sum,num,m,count;
        int str[110][110]={0};
        char c;
        count=0;
        printf("请输入一个整数:");
        scanf("%d",&num);
        for(l=3;l<=num;l++)
        {
                cubed=pow(l,3);
                for(i=2;;i++)
                {
                        for(j=3;;j=j+2)
                        {
                                sum=j*i+i*(i-1);                                //设分解后的第一个奇数是j,一共有i个
                                if(sum>cubed)
                                {
                                        break;
                                }
                                else if(sum==cubed)                        //得到j和i,同时将成功次数加1
                                {
                                        count=count+1;
                                        flag=1;
                                        break;
                                }
                        }
                        if(flag)
                        {       
                                break;
                        }
                }
                for(k=0;k<i;k++)
                {
                        str[l][k]=j+2*k;                                        //把分解的奇数存放
                }
        }
        if(count==num-2)                                        //如果成功分解次数等于3-num的个数,说明定理成立。
        {
                printf("成立!\n");
        }
        else
        {
                printf("不成立!\n");
        }
        printf("是否需要打印?y/n:");
        getchar();
        scanf("%c",&c);
        if(c=='y')
        {
                for(m=3;m<=num;m++)
        {
                cubed=pow(m,3);
                printf("%d=",cubed);
                for(n=0;n<100;n++)
                {
                        if(str[m][n]==0)
                        {
                                break;
                        }
                        else
                        {
                                printf("%d+",str[m][n]);
                        }
                }
                printf("\b");
                printf("\n");
        }
        }
         return 0;
        }
屏幕截图 2021-10-05 164901.png
这是我的动动手2的答案,每次试到5的时候就开始犯病了。这是为啥啊??大佬们救救我吧。
最佳答案
2021-10-5 16:54:24

没有看懂你的那个公式,你用错公式了吧?

  1. sum = j * i + i * (i - 1);
复制代码

这个公式就是计算 i 到 j 之间的所有奇数的和吧?
  1. i,i + 2,i + 4,i + 6,。。。,j
复制代码



1.jpg

  1. #include <stdio.h>
  2. #include <stdbool.h>

  3. int main(void) {
  4.     size_t n;
  5.     printf("请输入一个数:");
  6.     scanf("%lu", &n);
  7.     size_t cubed = n * n * n;
  8.     size_t i, j;
  9.     for(i = 1; ; i += 2) {
  10.         for(j = i; ; j += 2) {
  11.             size_t num = (j - i) / 2 + 1;
  12.             size_t sum = (i + j) * num / 2;
  13.             if(sum > cubed) break;
  14.             if(sum == cubed) goto done;
  15.         }
  16.     }
  17. done:
  18.     printf("%lu => ", cubed);
  19.     for(; i <= j; i += 2) {
  20.         printf("%lu ", i);
  21.     }
  22.     printf("\n");
  23.     return 0;
  24. }
复制代码

  1. $ gcc-debug -o main main.c
  2. $ ./main
  3. 请输入一个数:3
  4. 27 => 7 9 11
  5. $ ./main
  6. 请输入一个数:4
  7. 64 => 1 3 5 7 9 11 13 15
  8. $ ./main
  9. 请输入一个数:5
  10. 125 => 21 23 25 27 29
  11. $
复制代码


  1. #include <stdio.h>
  2. #include <stdbool.h>

  3. int main(void) {
  4.     size_t n;
  5.     printf("请输入一个数:");
  6.     scanf("%lu", &n);
  7.     size_t cubed = n * n * n;
  8.     size_t i, j;
  9.     for(i = 1; ; i += 2) {
  10.         for(j = i; ; j += 2) {
  11.             //size_t num = (j - i) / 2 + 1;
  12.             //size_t sum = (i + j) * num / 2;
  13.             size_t sum = j * i + i * (i - 1);
  14.             if(sum > cubed) break;
  15.             if(sum == cubed) goto done;
  16.         }
  17.     }
  18. done:
  19.     printf("%lu => ", cubed);
  20.     for(; i <= j; i += 2) {
  21.         printf("%lu ", i);
  22.     }
  23.     printf("\n");
  24.     return 0;
  25. }
复制代码

  1. $ gcc-debug -o main main.c
  2. $ ./main
  3. 请输入一个数:3
  4. 27 => 1 3 5 7 9 11 13 15 17 19 21 23 25 27
  5. $
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-10-5 14:50:35 | 显示全部楼层
还有每次打印式子我发现\b并没有起作用,我用的是Dev-c++
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-5 15:06:19 | 显示全部楼层
没有看明白你的问题
还有,题目是什么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-5 15:08:34 | 显示全部楼层
人造人 发表于 2021-10-5 15:06
没有看明白你的问题
还有,题目是什么?

验证尼科彻斯定理:任何一个大于 2 的整数的立方都可以表示成一串连续奇数的和,这些奇数一定是要连续的(比如 3^3 == 7 + 9 + 11)。用户输入某个整数,验证该数是否符合尼科彻斯定理,并将对应的式子打印出来。改进(动动手2):用户输入一个表示范围的最大值 count,程序将测试 3 ~ count 所有的整数是否都符合尼科彻斯定理。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-5 15:10:33 | 显示全部楼层
就是我用1的方法是没问题的,结果同样的式子用到动动手2发现就出问题了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-5 15:37:14 | 显示全部楼层
软大头 发表于 2021-10-5 15:10
就是我用1的方法是没问题的,结果同样的式子用到动动手2发现就出问题了。

看不懂你这个式子,这是在做什么?
  1. sum = j * i + i * (i - 1);
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-5 15:48:06 | 显示全部楼层
本帖最后由 软大头 于 2021-10-5 15:49 编辑
人造人 发表于 2021-10-5 15:37
看不懂你这个式子,这是在做什么?

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

使用道具 举报

发表于 2021-10-5 16:11:26 | 显示全部楼层
n*n*n=n*(n*n),
令a=n*n,所以n*(n*n)=>n*a=>a+a+a+...+a(n个a相加);
if(n%2){(a-n/2*2)+....+a-2+a+(a+2)+(a+4)+...+(a+n/2*2)}
else
{(a-n/2*2+1)+...+(a-1)+(a+1)+(a+3)+....+(a+n/2*2-1)}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-5 16:13:54 | 显示全部楼层
        原来是尼克彻斯
  1. #include <stdio.h>

  2. int nico(int n)
  3. {
  4.         int h , k                                             ;
  5.         h = n * n - n                                         ;
  6.         if(! (h % 2)) h ++                                    ;
  7.         printf("%d" , h)                                      ;
  8.         for(k = 1 ; k < n ; k ++) printf(" + %d" , h + 2 * k) ;
  9.         printf("\n")                                          ;
  10.         return h                                              ;
  11. }

  12. int main(void)
  13. {
  14.         char s[64]                                            ;
  15.         int d , m                                             ;
  16.         for(;;) {
  17.                 printf("An integer please : ")                ;
  18.                 fgets(s , 64 , stdin)                         ;
  19.                 if(m) {
  20.                         sscanf(s , "%d" , & d)                ;
  21.                         nico(d)                               ;
  22.                         printf("\n")                          ;
  23.                 } else {
  24.                         break                                 ;
  25.                 }
  26.         }
  27. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-5 16:25:09 | 显示全部楼层

额我没学多少所以不知道int main前面的式子啥意思,我想问下我的第二个式子哪里出错了,第一个式子我试过没问题了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-5 16:54:24 | 显示全部楼层    本楼为最佳答案   

没有看懂你的那个公式,你用错公式了吧?

  1. sum = j * i + i * (i - 1);
复制代码

这个公式就是计算 i 到 j 之间的所有奇数的和吧?
  1. i,i + 2,i + 4,i + 6,。。。,j
复制代码



1.jpg

  1. #include <stdio.h>
  2. #include <stdbool.h>

  3. int main(void) {
  4.     size_t n;
  5.     printf("请输入一个数:");
  6.     scanf("%lu", &n);
  7.     size_t cubed = n * n * n;
  8.     size_t i, j;
  9.     for(i = 1; ; i += 2) {
  10.         for(j = i; ; j += 2) {
  11.             size_t num = (j - i) / 2 + 1;
  12.             size_t sum = (i + j) * num / 2;
  13.             if(sum > cubed) break;
  14.             if(sum == cubed) goto done;
  15.         }
  16.     }
  17. done:
  18.     printf("%lu => ", cubed);
  19.     for(; i <= j; i += 2) {
  20.         printf("%lu ", i);
  21.     }
  22.     printf("\n");
  23.     return 0;
  24. }
复制代码

  1. $ gcc-debug -o main main.c
  2. $ ./main
  3. 请输入一个数:3
  4. 27 => 7 9 11
  5. $ ./main
  6. 请输入一个数:4
  7. 64 => 1 3 5 7 9 11 13 15
  8. $ ./main
  9. 请输入一个数:5
  10. 125 => 21 23 25 27 29
  11. $
复制代码


  1. #include <stdio.h>
  2. #include <stdbool.h>

  3. int main(void) {
  4.     size_t n;
  5.     printf("请输入一个数:");
  6.     scanf("%lu", &n);
  7.     size_t cubed = n * n * n;
  8.     size_t i, j;
  9.     for(i = 1; ; i += 2) {
  10.         for(j = i; ; j += 2) {
  11.             //size_t num = (j - i) / 2 + 1;
  12.             //size_t sum = (i + j) * num / 2;
  13.             size_t sum = j * i + i * (i - 1);
  14.             if(sum > cubed) break;
  15.             if(sum == cubed) goto done;
  16.         }
  17.     }
  18. done:
  19.     printf("%lu => ", cubed);
  20.     for(; i <= j; i += 2) {
  21.         printf("%lu ", i);
  22.     }
  23.     printf("\n");
  24.     return 0;
  25. }
复制代码

  1. $ gcc-debug -o main main.c
  2. $ ./main
  3. 请输入一个数:3
  4. 27 => 1 3 5 7 9 11 13 15 17 19 21 23 25 27
  5. $
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-5 17:01:42 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdbool.h>

  3. void output(size_t n) {
  4.     size_t cubed = n * n * n;
  5.     size_t i, j;
  6.     for(i = 1; ; i += 2) {
  7.         for(j = i; ; j += 2) {
  8.             size_t num = (j - i) / 2 + 1;
  9.             size_t sum = (i + j) * num / 2;
  10.             if(sum > cubed) break;
  11.             if(sum == cubed) goto done;
  12.         }
  13.     }
  14. done:
  15.     printf("%lu => ", cubed);
  16.     for(; i <= j; i += 2) {
  17.         printf("%lu ", i);
  18.     }
  19.     printf("\n");
  20. }

  21. int main(void) {
  22.     size_t a, b;
  23.     printf("请输入两个数:");
  24.     scanf("%lu%lu", &a, &b);
  25.     for(size_t i = a; i <= b; ++i) output(i);
  26.     return 0;
  27. }
复制代码

  1. $ gcc-debug -o main main.c
  2. $ ./main
  3. 请输入两个数:3 9
  4. 27 => 7 9 11
  5. 64 => 1 3 5 7 9 11 13 15
  6. 125 => 21 23 25 27 29
  7. 216 => 7 9 11 13 15 17 19 21 23 25 27 29
  8. 343 => 43 45 47 49 51 53 55
  9. 512 => 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47
  10. 729 => 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53
  11. $
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-5 17:02:07 | 显示全部楼层
人造人 发表于 2021-10-5 16:54
没有看懂你的那个公式,你用错公式了吧?

我是将n*n*n分解为[j,(j+2),(j+4)+....+(j+2i-2)]一共i项
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-5 17:05:51 | 显示全部楼层
软大头 发表于 2021-10-5 17:02
我是将n*n*n分解为[j,(j+2),(j+4)+....+(j+2i-2)]一共i项

主要是我第一个答案没问题。同样的方法再用到下一道题从输入的数为4开始时,i就一直等于2了,也不知道问题出在哪了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-5 17:06:24 | 显示全部楼层
软大头 发表于 2021-10-5 17:02
我是将n*n*n分解为[j,(j+2),(j+4)+....+(j+2i-2)]一共i项

这里为什么要算 n * n * n
这里不应该是算
i + (i + 2) + (i + 4) + (i + 6) + ...
算这个的和是不是 cubed 吗?
为什么要算  n * n * n
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-5 17:08:21 | 显示全部楼层
人造人 发表于 2021-10-5 17:06
这里为什么要算 n * n * n
这里不应该是算
i + (i + 2) + (i + 4) + (i + 6) + ...

是cubed,然后我把起始的奇数设为j,一共i项
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-5 17:10:53 | 显示全部楼层
软大头 发表于 2021-10-5 17:08
是cubed,然后我把起始的奇数设为j,一共i项

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

使用道具 举报

 楼主| 发表于 2021-10-5 17:13:19 | 显示全部楼层

麻烦您了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-5 17:37:24 | 显示全部楼层
看懂你的那个公式了,公式没问题
错误在于 flag 没有复位

  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdbool.h>

  4. int main() {
  5.     bool flag = 0;
  6.     int i, j, k, l, n, cubed, sum, num, m, count;
  7.     int str[110][110] = {0};
  8.     char c;
  9.     count = 0;
  10.     printf("请输入一个整数:");
  11.     scanf("%d", &num);
  12.     for(l = 3; l <= num; l++) {
  13.         cubed = pow(l, 3);

  14.         // 这里
  15.         flag = 0;

  16.         for(i = 2;; i++) {
  17.             for(j = 3;; j = j + 2) {
  18.                 sum = j * i + i * (i - 1); //设分解后的第一个奇数是j,一共有i个
  19.                 if(sum > cubed) {
  20.                     break;
  21.                 } else if(sum == cubed) //得到j和i,同时将成功次数加1
  22.                 {
  23.                     count = count + 1;
  24.                     flag = 1;
  25.                     break;
  26.                 }
  27.             }
  28.             if(flag) {
  29.                 break;
  30.             }
  31.         }
  32.         for(k = 0; k < i; k++) {
  33.             str[l][k] = j + 2 * k; //把分解的奇数存放
  34.         }
  35.     }
  36.     if(count == num - 2) //如果成功分解次数等于3-num的个数,说明定理成立。
  37.     {
  38.         printf("成立!\n");
  39.     } else {
  40.         printf("不成立!\n");
  41.     }
  42.     printf("是否需要打印?y/n:");
  43.     getchar();
  44.     scanf("%c", &c);
  45.     if(c == 'y') {
  46.         for(m = 3; m <= num; m++) {
  47.             cubed = pow(m, 3);
  48.             printf("%d=", cubed);
  49.             for(n = 0; n < 100; n++) {
  50.                 if(str[m][n] == 0) {
  51.                     break;
  52.                 } else {
  53.                     printf("%d+", str[m][n]);
  54.                 }
  55.             }
  56.             //printf("\b");
  57.             printf("\n");
  58.         }
  59.     }
  60.     return 0;
  61. }
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
软大头 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

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

使用道具 举报

 楼主| 发表于 2021-10-5 18:10:20 | 显示全部楼层
人造人 发表于 2021-10-5 17:37
看懂你的那个公式了,公式没问题
错误在于 flag 没有复位

哦哦哦哦哦哦,谢谢大佬,辛苦你了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-28 16:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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