先举一些栗子吧:
1^3=1
2^3=3+5=8
3^3=7+9+11=27
4^3=13+15+17+19=64
5^3=21+23+25+27+29=125
先由上面这些栗子可以看出一些简单的规律,
1、连续的整数找出的这些一连串的奇数也是连续的,
2、每个整数对应的奇数列的数字个数等于这个数的数值,
3、每个奇数列的首项和末项与对应的整数有对应的表达式,如21=5*5-5+1,29=5*5+5-1
4、奇数数列的中间项或中间两项平均值就是对应整数n的平方,以这个平方数向两边延伸n个奇数项,这些项的和就是n平方值乘n。
不过定理说至少有一个连续奇数列,也许有的数不止一个奇数列,但是我想不出来了,能写出一个算法来证明有一个那就可以了吧。
根据上面总结的规律写出了下面这个程序:
#include<stdio.h>
#define N 30
void prove(int n)
{
int m=n*n*n,x=n*n-n+1;
int i,s=0,a[N],j,count=0;
//printf("%d %d %d\n",m,x,s);
for(i=x,j=0;s!=m;i+=2,j++)
{
//printf("%d %d %d\n",i,j,s);
if(s>m)
{
printf("This theorem is wrong.\n");
break;
}
else
{
a[j]=i;
count++;
}
s+=i;
}
printf("%d^3=\t",n);
for(i=0;i<count;i++)
{
if(i==count-1)
printf("%-5d",a[i]);
else
printf("%-5d+",a[i]);
if((i+1)%10==0&&i!=count-1)
printf("\n\t");
}
printf("\n");
}
int main()
{
int i=2;
for(i=2;i<=20;i++)
prove(i);
return 0;
}
在函数prove()里面用s=n^3作为循环结束的标志,在循环内部也设置了如果s>n^3就跳出循环并输出错误信息的语句,也就是说如果没有输出错误信息,最后记录在数组里的数都是满足要求的连续奇数列。最后输出按照满10个数字换行进行排版,勉强看得过去。具体看图: