主题:第二界编程比赛试题
黄金风格
[专家分:4050] 发布于 2005-10-20 13:06:00
输入两个整数(要求100以内的自然数),若这两个整数之间存在自然数对,则将其中所有的自然数对输出,否则输出不存在的提示.所谓的自然数对是指两个自然数的和与差都是平方数.例如:17-8=9,17+8=25,那么17与8就是自然数对!
例如:输入:2 11
输出: 4 5
6 10
请大家按要求做题,一定要严密,贴上最优的代码!
由于本的能力有限,我想采取大家投票的方式取下届冠军.
请大家投自己最中意的程序编者!!
回复列表 (共72个回复)
41 楼
eastcowboy [专家分:25370] 发布于 2005-10-20 15:55:00
我觉得自己31楼的程序是没有问题的,如果有谁硬要输入字母,那当就我没说过这话。
对比验证了36楼的程序。输入1,50
可以得到13组解,而我的则有14组。对比发现我多了一组40,41。而其他组除顺序外完全一样。(40+41 = 81,41-40 = 1这个应该是符合要求的吧?)
速度上还是31楼的程序稍快一点点,不过用的时间都是同一数量级的,计算1到1000万使用时间少于1秒。估计是函数调用的开销比较多。
42 楼
cole [专家分:960] 发布于 2005-10-20 15:55:00
#include<stdio.h>
#include<math.h>
main()
{int i,j,k,t;
k=t=0;
scanf("%d%d",&i,&j);
if((i>=0&&i<=100)&&(j>=0&&j<=100))
{k=j-i;t=j+i;
k=abs(k);
if(k==sqrt(k)^2&&t==sqrt(t)^2)
printf("%d %d\n",i,j);
}
else
printf("the error!");
}
43 楼
cole [专家分:960] 发布于 2005-10-20 15:55:00
fd
44 楼
江大沙锅 [专家分:5660] 发布于 2005-10-20 15:58:00
刚下课,随便写了一下,不知错没错,试了几个还行
#include<stdio.h>
#include<math.h>
void main()
{
int n,m,i,j=1;
printf("请输入两个100之内的自然数\n");
scanf("%d%d",&n,&m);
for(i=n;i<=m;i++)
{
while((i+j*j)<=m)
{
if(sqrt(2*i+j*j)-(int)sqrt(2*i+j*j)==0)
printf("(%d %d) ",i,i+j*j);
//printf(" ");
j++;
}
j=1;
}
printf("\n");
}
45 楼
ppc [专家分:3090] 发布于 2005-10-20 15:59:00
31楼输入错误一次,后面就不可能输入正确了^_^
仔细看看吧。while里面是给a和b输入值,判断的是min和max
35楼的里面两个数的起点相差2,造成了40,41的缺少^_^
46 楼
eastcowboy [专家分:25370] 发布于 2005-10-20 16:00:00
好多回复啊!楼主会累死的,是不是考虑召集几个志愿者来帮忙测试?
另外cole有严重的恶意刷版行为!建议封ID……(是不是太狠了?)
47 楼
ppc [专家分:3090] 发布于 2005-10-20 16:02:00
论程序的强壮性还是我的好[em12]
就是效率差了点[em8]
48 楼
eastcowboy [专家分:25370] 发布于 2005-10-20 16:08:00
再看了31楼,真的错了,不好意思……(现在已改正)
49 楼
wlsxj [专家分:1180] 发布于 2005-10-20 16:10:00
#include <math.h>
main()
{
int a,b;
int i,j,max,min;
int flag=0;
printf("Input a and b:");
scanf("%d%d",&a,&b);
while(1)
{
if(a>=1&&a<=100&&b>=1&&b<=100) break;
else
{
printf("\nyour input is wrong,input the right numbers:");
scanf("%d%d",&a,&b);
}
}
max=a>b?a:b; /*两数较大者赋给max*/
min=a<b?a:b; /*两数较小者赋给min*/
for(i=min;i<=max;i++)
{
for(j=i;j<=max;j++)
if((sqrt(j+i)==(int)sqrt(j+i))&&(sqrt(j-i)==(int)sqrt(j-i)))
/*上式是判断是否符合要求,如是则输出*/
{ printf("%d,%d\n",i,j); flag=1;}
}
if(flag==0)/*如没有符合的数则输出下面提示*/
printf("\nno numbers match");
getch();
}
50 楼
yimi329 [专家分:50] 发布于 2005-10-20 16:29:00
给楼主:
我觉得你出的题还是不太理想吧。如果把限制(1~100)扩大一点,就不会出现38楼的做法了(当然在你的要求下,他的做法的确很不错)。
按你的要求,2 2这样的结果肯定是不会出现的,你也没有说明输入时要先输小,再输大,故也需判断两数据的大小。这一点在审题时得注意啊!
以上仅是我个人的意见和建议,若有不妥之处,还望楼主见谅。
我来回复