| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
 本帖最后由 LoveQQ 于 2020-11-5 18:47 编辑  
 
S1E21的课后作业,验证大于2的整数的立方都可以表示为几个连续的奇数相加的形式,下面是我自己打的代码。 
我把奇数全部算好存到二维数组a里,但是最后打印出来的结果a[0][0] = 0。我在下面红色代码前后测试了一下a[0][0]的值,发现在这段代码前面打印a[0][0] = 7,在后面打印a[0][0] = 0。然后我把所有的 [num - 3] 改成 [num - 2] 就没这问题了。请问这是为啥子嘞??? 
 
 
#include <stdio.h> 
#include <math.h> 
 
#define MAX 1024 
 
int main() 
{ 
        int k, n, num, cube, sum = 0; 
        int i, j, count; 
        long long int a[200][MAX] = {0}; 
        char choice; 
         
        printf("请输入一个整数:"); 
        scanf("%d", &count); 
         
        for (num = 3; num <= count; num++) 
        { 
                cube = pow(num, 3); 
                 
                for (i = 0; i < MAX; ) 
                { 
                        for (n = i; n < MAX; n++) 
                        { 
                                k = 2 * n + 1; 
                                sum += k; 
                                if (cube == sum) 
                                { 
                                        for (j = i; j <= n; j++) 
                                        { 
                                                a[num - 3][j - i] = 2 * j + 1; 
                                        } 
                                        break; 
                                } 
                         
                                if (cube < sum) 
                                { 
                                        sum = 0; 
                                        goto A; 
                                } 
                        } 
                        break; 
                        A: i++;         
                } 
                 
        } 
         
         
        printf("是否打印所有式子(y/n):"); 
        scanf("%s", &choice); 
         
        if (choice == 'n') 
        { 
                printf("经验证,3 ~ %d 之间所有的整数均符合尼科彻斯定理!\n", count); 
        } 
        else 
        { 
                for (num = 3; num <= count; num++) 
                { 
                        cube = pow(num, 3); 
                         
                        printf("%d^3 = %d = %d", num, cube, a[num - 3][0]); 
                        for (j = 1; a[num - 3][j] != 0; j++) 
                        { 
                                printf(" + %d", a[num - 3][j]); 
                        } 
                        printf("\n"); 
                } 
        } 
         
        return 0; 
}
验证尼科彻斯定理,我觉得你搞太复杂了,程序运行有错误,由于我刚开始使用VS2015,怎么调试程序,还没有搞溜,弄了两个小时了,也没有弄出什么结果来。下面第一个程序是课后练习的答案,第二个程序是我自己写的程序,供你参考: 
 
- // 验证任意一个正整数的立方都是一系列连续奇数的和
 
  
- #include <stdio.h>
 
  
- int main()
 
 - {
 
 -         int i, j, n, cubed, sum = 0;
 
  
-         printf("请输入一个整数:");
 
 -         scanf("%d", &n);
 
  
-         cubed = n * n * n;
 
  
-         for (i = 1; i < cubed; i += 2)
 
 -         {
 
 -                 for (j = i; j < cubed; j += 2)
 
 -                 {
 
 -                         sum += j;
 
 -                         if (sum == cubed)
 
 -                         {
 
 -                                 if (j - i > 4)
 
 -                                 {
 
 -                                         printf("%d = %d + %d ... + %d\n", cubed, i, i+2, j);
 
 -                                 }
 
 -                                 else
 
 -                                 {
 
 -                                         printf("%d = %d + %d + %d\n", cubed, i, i+2, i+4);
 
 -                                 }
 
 -                                 goto FINDIT;
 
 -                         }
 
  
-                         if (sum > cubed)
 
 -                         {
 
 -                                 sum = 0;
 
 -                                 break;
 
 -                         }
 
 -                 }
 
 -         }
 
  
- FINDIT:
 
  
-         return 0;
 
 - }
 
 
  复制代码 
我自己写的如下:
  
- // 验证尼科彻斯定理:任何一个正整数的立方都可以写成一串连续奇数的和
 
 - #include<stdio.h>
 
 - #include<math.h>
 
  
- int main()
 
 - {
 
  
-         int a,b,s,i,j,first;
 
 -         int total = 0;
 
 -         printf("一个数 N 立方等于 N 个 N 的平方之和,即:N ^ 3 = N * N ^ 2\n");
 
 -         printf("即:(N ^ 2 - N) + (N ^ 2 - (N - 1)) ... + N ^ 2 ... + (N ^ 2 + (N - 1) + (N ^ 2 + N)\n");
 
 -         printf("为了确保首项为奇数,故有:N ^ 2 - N + 1\n");
 
 -         printf("请输入一个整数:");
 
 -         scanf("%d",&a);
 
 -         
 
 -         b=pow(a,3);
 
 -                 printf("%d 的立方:b = %d\n",a,b);
 
 -         s = a * a - a + 1;
 
 -                 first = s;
 
 -         for (i = 1;i < b;i++)
 
 -         {
 
 -                 total += s;
 
 -                 s += 2;
 
 -                 if (total == b)
 
 -                 {
 
 -                         printf("b 由 %d 个奇数相加得到\n",i);
 
 -                         break;
 
 -                 }
 
 -          }
 
 -          printf("b = %d",first);
 
 -          for (j = 2;j < 2 * i;j=j + 2)
 
 -          {
 
 -                         printf(" + %d",first + j);
 
 -          }
 
 -          printf("\n");
 
 - }
 
 
  复制代码 
 
 
 |   
 
 
 
 |