编程证明以下定理与猜想,不考虑输入与输出超int型精度问题:
一、四方定理:所有的自然数至多只用4个数(可重复,且先后顺序随意)的平方和就可以表示出来,
例如:25=1*1+2*2+2*2+4*4,99=1*1+1*1+4*4+9*9,17=1*1+4*4。
在这里,输入一个正整数n,输出所有表示方法。
源代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define maxn 10
int a[maxn]={0}; //记录符合条件的自然数
void Judge(int a[],int i,int j,int k,int l,int n) //结果判断
{
int count=0;
printf("%d=",n);
if(i!=0) //自然数为0时,不保存
a[count++]=i;
if(j!=0)
a[count++]=j;
if(k!=0)
a[count++]=k;
if(l!=0)
a[count++]=l;
if(count==1) //符合条件的自然数只有一个时,输出第一项
printf("%d*%d\n",a[0],a[0]);
else //否则输出所有项
{
for(i=0;i<count-1;i++)
printf("%d*%d+",a[i],a[i]);
printf("%d*%d\n",a[count-1],a[count-1]);
}
}
void Init(int a[]) //数组初始化,避免结果干扰
{
int i;
for(i=0;i<maxn;i++)
a[i]=0;
}
int main()
{
int n,sum;
int i,j,k,l;
int count;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=sqrt(n);i++) //第一个循环变量的值不会超过其算术平方根
{
for(j=0;j<=i;j++)
{
for(k=0;k<=j;k++)
{
for(l=0;l<=k;l++)
{
if(n==i*i+j*j+k*k+l*l)
{
Judge(a,i,j,k,l,n);
Init(a);
//exit(0); //输出一组解后退出循环(即整个进程)
}
}
}
}
}
}
return 0;
}
程序截图: