回 帖 发 新 帖 刷新版面

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

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

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


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

回复列表 (共72个回复)

21 楼

#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!");
}

22 楼

我也来凑凑热闹

#include <stdio.h>

int squareNum[30];    //200以内的平方数
int len;            //200以内的平方数个数

int isSq(int num)    //num是平方数返回1否则返回0
{
    int i;
    for(i = 0; i < len; i++)
        if(squareNum[i] == num)
            return 1;
    return 0;
}

int main()
{
    int i, j, temp;
    int sma, big;

    for(len = 0, i = 1; (j = i*i) < 200; i++)    //初始化平方数表
        squareNum[len++] = j;                    //j的介入是有意图的 -- 减少乘法运算

    scanf("%d%d",&sma, &big);
    if(sma > big)
    {
        temp = sma;
        sma = big;
        big = temp;
    }

    for(i = sma; i <= big; i++)            //双层循环的循环设计作了优化
        for(j = big; j >= sma; j--)
            if(isSq(i+j) && isSq(j-i))    //判断数队的组合方法作了优化
            {
                printf("%4d%4d\n",i,j);
                break;        //break的介入是有意图的 -- 找到一组解进入下轮
            }
    return 0;
}

23 楼

to cole你是来踢馆子的吗?
呵呵,偶写了个笨笨的傻程序
#include <stdio.h>
#include <math.h>

int findfun(int n1, int n2, int i);

main()
{
    int i, n1, n2;
    scanf("%d", &n1);
    scanf("%d", &n2);
    i = 1;
    findfun(n1, n2, i);
}

int findfun(n1, n2, i)
{
    int j, n, ii;
    ii = i * i;
    if( n1 + ii > n2 )
        return 0;
    for(j = n1; j + ii <= n2; ){
        n = (int)sqrt(j + j + ii);
        if( n * n == j + j + ii)
            printf("%d\t%d\n",j, j + ii);
        j++;
        }
    i++;
    findfun(n1, n2, i);
}

24 楼


[color=008000]#include <stdio.h>[/color]
[color=008000]#include <math.h>[/color]
[color=0000FF]int[/color] isPow(int in);
[color=0000FF]void[/color] main()
{
    [color=0000FF]int[/color]        m,n,i,j,tmp,flag = 0;

    printf("enter two numbers 1~100:\n");
    scanf("%d %d",&m,&n);
    [color=0000FF]if[/color](m > n) {
        tmp = m;
        m = n;
        n = tmp;
    }

    [color=0000FF]for[/color](i = m;i <= n;i++) {
        [color=0000FF]for[/color](j = i+1;j <= n;j++) {
            [color=0000FF]if[/color](isPow(i+j) == 0 && isPow(j-i) == 0) {
                flag = 1;
                printf("%d %d\n",i,j);
            }
        }
    }

    [color=0000FF]if[/color](flag == 0) printf("result not found!");
}

[color=0000FF]int[/color] isPow(int in) {
    [color=0000FF]double[/color]    result;
    [color=0000FF]int[/color]        tmp;

    result = sqrt(in);
    tmp = result;
    [color=0000FF]return[/color](result-tmp > 0?1:0);
}



25 楼

到目前为止,编译试验后,此页之前的还没有一个人的C代码通过,C++的没有去试。

26 楼

#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!");
}

27 楼

@探路者二号,25
你用的编译器是...?

28 楼

@cole
不要再重复发贴了~浪费这点资源不算多,但大家都要翻来翻去就毁了不少时间。

btw. 有没有人来阻止cole?

29 楼

第22楼程序有点错误[不能加BREAK]
修正如下:

#include <stdio.h>

int squareNum[20];    //200以内的平方数
int len;            //200以内的平方数个数

int isSq(int num)    //num是平方数返回1否则返回0
{
    int i;
    for(i = 0; i < len; i++)
        if(squareNum[i] == num)
            return 1;
    return 0;
}

int main()
{
    int i, j, temp;
    int sma, big;

    for(len = 0, i = 1; (j = i*i) < 200; i++)    //初始化平方数表
        squareNum[len++] = j;                    //j的介入是有意图的 -- 减少乘法运算

    scanf("%d%d",&sma, &big);
    if(sma > big)
    {
        temp = sma;
        sma = big;
        big = temp;
    }

    for(i = sma; i <= big; i++)            //双层循环的循环设计作了优化
        for(j = big; j >= i; j--)
            if(isSq(i+j) && isSq(j-i))    //判断数队的组合方法作了优化
                printf("%4d%4d\n",i,j);
    return 0;
}

//另:楼主如果是用的OJ提交的话只怕有点问题 因为输出格式可能与要求不符

30 楼

这是我的,比较符合题意,也能大大减少冗余的计算。来看一下:

#include "math.h"
main()
{    int a,b,c,i,j,k;
    float d;
    scanf("%d",&a);
    scanf("%d",&b);
    if(a>b) i=a,j=b;
    else i=b,j=a;
    if(i<100&&j>0)
    while(i>j)
    {    for(k=i-1;k>=j;k--)
            {    c=i-k;
            if(c==1||c==4||c==9||c==16||c==25||c==36||c==49||c==64||c==81)
            {    d=sqrt(i+k);
                if(d-floor(d)==0) printf("%2d;%2d\t",k,i);
            }
        }
        i--;
    }
    else printf("请输入0—100之间的整数");

我来回复

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