[原]关于编程验证四方定理的一点想法

王朝other·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

最近看电脑报有一个叫作《编程擂台》的栏目,要求证明四方定理,仔细一看题目不觉得难,就尝试了一下,在选修课上兴冲冲的(自以为是的)把算法想到了,回来一试,在验证1000的时候出现了问题,次数成了5次,也就是说1000 = 31 * 31 + 6 * 6 + 1 * 1 + 1 * 1 + 1* 1;这显然不对,如果换成500的话就显示2,又是对的,500被分解成22 * 22 + 4 * 4,于是我明白了还是算法出问题了。

今天上网搜索了一下四方定理,发现解法真是极其简单,用的就是穷举搜索,除去效率的问题(我本身用的时递归,效率也不高)。看来有的时候想问题真是会把问题想得过于复杂了。呵呵:)

我的算法:

#include <iostream>

#include <math.h>

using namespace std;

static short unsigned a = 0;

void Func(int i)

{

int j = sqrt( i );

if (!( i - j * j ))

{

a ++;

}

else

{

Func( i - j * j );

a ++;

}

}

int main()

{

int k = 0;

cin >> k;

Func( k );

cout << a <<endl;

return 0;

}

正确算法:

*问题分析与算法设计

本题是一个定理,我们不去证明它而是编程序验证。

对四个变量采用试探的方法进行计算,满足要求时输出计算结果。

*程序与程序注释

#include<stdio.h>

#include<stdlib.h>

void main()

{

int number,i,j,k,l;

printf("Please enter a number=");

scanf("%d",&number); /*输入整数*/

for(i=1;i<number/2;i++) /*试探法。试探i,j,k,k的不同值*/

for(j=0;j<=i;j++)

for(k=0;k<=j;k++)

for(l=0;l<=k;l++)

if(number==i*i+j*j+k*k+l*l) /*若满足定理要求则输出结果*/

{

printf(" %d=%d*%d+%d*%d+%d*%d+%d*%d\n",number,i,i,j,j,k,k,l,l);

exit(0);

}

}

*运行结果

1) Please enter a number = 110

110=7*7+6*6+4*4+3*3

2) Please enter a number = 211

211=8*8+7*7+7*7+7*7

3) Please enter a number = 99

99=7*7+5*5+4*4+3*3

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航