回 帖 发 新 帖 刷新版面

主题:第二界编程比赛试题

输入两个整数(要求100以内的自然数),若这两个整数之间存在自然数对,则将其中所有的自然数对输出,否则输出不存在的提示.所谓的自然数对是指两个自然数的和与差都是平方数.例如:17-8=9,17+8=25,那么17与8就是自然数对!

例如:输入:2  11
     
      输出: 4  5
            6  10


请大家按要求做题,一定要严密,贴上最优的代码!
由于本的能力有限,我想采取大家投票的方式取下届冠军.
请大家投自己最中意的程序编者!!

回复列表 (共72个回复)

41 楼

我觉得自己31楼的程序是没有问题的,如果有谁硬要输入字母,那当就我没说过这话。

对比验证了36楼的程序。输入1,50
可以得到13组解,而我的则有14组。对比发现我多了一组40,41。而其他组除顺序外完全一样。(40+41 = 81,41-40 = 1这个应该是符合要求的吧?)

速度上还是31楼的程序稍快一点点,不过用的时间都是同一数量级的,计算1到1000万使用时间少于1秒。估计是函数调用的开销比较多。

42 楼

#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 楼

fd

44 楼

刚下课,随便写了一下,不知错没错,试了几个还行
#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 楼

31楼输入错误一次,后面就不可能输入正确了^_^
仔细看看吧。while里面是给a和b输入值,判断的是min和max
35楼的里面两个数的起点相差2,造成了40,41的缺少^_^

46 楼

好多回复啊!楼主会累死的,是不是考虑召集几个志愿者来帮忙测试?
另外cole有严重的恶意刷版行为!建议封ID……(是不是太狠了?)

47 楼

论程序的强壮性还是我的好[em12]
就是效率差了点[em8]

48 楼

再看了31楼,真的错了,不好意思……(现在已改正)

49 楼

#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 楼

给楼主:
  我觉得你出的题还是不太理想吧。如果把限制(1~100)扩大一点,就不会出现38楼的做法了(当然在你的要求下,他的做法的确很不错)。
  按你的要求,2 2这样的结果肯定是不会出现的,你也没有说明输入时要先输小,再输大,故也需判断两数据的大小。这一点在审题时得注意啊!

以上仅是我个人的意见和建议,若有不妥之处,还望楼主见谅。

我来回复

您尚未登录,请登录后再回复。点此登录或注册