回 帖 发 新 帖 刷新版面

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

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

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


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

回复列表 (共72个回复)

51 楼

还是搭个oj来测吧...这样既严格又公平...

52 楼

我(38楼的)的程序在数据扩展方面的确很麻烦,但是符合题意,并且减少了很多不必要的计算,如果是工程中遇到这种不需扩展数据的情况,我觉得还是挺实用的。

53 楼

时间度为O(high)的,(另外)这帖也能置顶真是不可思议

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int com (int low, int high)
{
    int m, n, i, j, flag = 0;
    int MIN = 0, MAX = sqrt (2 * high);

    for (i = MIN; i <= MAX; ++i)
        for (j = i; j <= MAX; ++j) {
            int p = i * i, q = j * j;
            if ((p + q) % 2 || !p && !q)
                continue;
            if ((m = (p + q)/2) < low || m > high)
                continue;
            if ((n = abs (p - q)/2) < low || n > high)
                continue;
            if (m == n) continue;
            printf ("%d %d\n", m, n);
            flag = 1;
        }
    return flag;
}

int main (void)
{
    printf ("%d\n", com (2, 11));
    getch ();

    return 0;
}

54 楼

下午上班的时候偷偷在办公室里搞的:
#include "Stdio.h"
#include "Conio.h"

int GetNum(int n)               /*用于获取输入数字,确保输入的是数字*/
{
        int     a,i=0;
        char    ch;
        while(i<n)
        {
                ch=getch();
                putch(ch);
                if(ch>='0' && ch<='9')
                {
                        a=a*i*10+(int)ch-'0';
                        i++;
                        continue;
                }
                if(ch==13 && i>=1)
                        break;
                a=0;
                i=0;
                printf("\n\tError: Your input is Not Number.\n\tplease retype:\n");
        }
        return  a;
}

IsSqre(int x)                   /*用于确定是否是平方数*/
{
        int     i,flag;
        flag=0;
        for(i=0;i<=100;i++)
        {
                if(x==i*i)
                flag=1;
        }
        if(flag==1)
        return  1;
        else
        return  0;
}

main()
{
        int     Ia,Ib,Temp,i,j; /*定义*/

        printf("\nplease input the first Number:\n");
        Ia=GetNum(2);           /*获取第一个数*/

        printf("\nplease input the second Number:\n");
        Ib=GetNum(2);           /*获取第二个数*/

        if(Ia>Ib)               /*排序*/
        {
                Temp=Ia;
                Ia=Ib;
                Ib=Temp;
        }
        printf("\nthe number you input is %d and %d \n",Ia,Ib);

        Temp=0;
        for(i=Ia;i<Ib;i++)
        {                       /*输出结果*/
                for(j=i+1;j<=Ib;j++)
                {

                        if(IsSqre(i+j))
                        if(IsSqre(j-i))
                        {
                                printf("%2d %2d\t",i,j);
                                Temp=1;
                        }
                }
        }
        if(Temp==0)
        printf("\nno result");

    getch();
    return 0;
}

55 楼

[url=http://upload.programfan.com/lovingyou.wmv]大家来看看站长的风采吧[/url]
来几张站长滴PP:
[img]http://storage.msn.com/x1pnp_rgmi5o51fMAAxXHPtECkjvaZ7Fvlflh-2tMJMaMIHSgx4pHBnGEybBD_JYVFwchebGAYf_LEGSRCBuOWvgKU93yEfVJMhiqydaC3pzoDSOFqrCz_bKURQLfSnkMbR[/img]

[img]http://storage.msn.com/x1pnp_rgmi5o51fMAAxXHPtEBNbE5wXaaH3mmNRq1FpWRuf-MTyZTxNMi_0zFtjwF9gwcbJd9xvfCjY4fui_sHQT9qNkN5cQAUN64rSpM84BAShKRKBgAmfbsaTY8pAjk8l[/img]


[em1][em1][em1][em1][em1]
嘎嘎 姚大哥不会怪罪小弟吧

56 楼

短短一个下午,就有了这么多程序!!六个页面,
翻来覆去很麻烦!!希望大家节省资源!不要贴一些无关的东西!!
像cole那样的真令人讨厌!!!

57 楼

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

58 楼

我想知道什么到时候才能结束呢。楼主啊,看着到时候了就关了吧。
再提醒某些人,不要坏大家的眼睛。不要重复发,这里是大家的地盘!

谢谢!

59 楼

cole:
你为什么那么讨厌??
你为什么不能给大家留一个好的印象??
这样对你有什么好??
难道你以为这样就能让更多的人看你的贴,支持你吗??
就像你这样,再好的程序也不会有人看,因为看你这个人就已经够了。
不过在这以前,我已经运行过你的代码,什么东西......

Sorry!我实在看不下去了才写了上面的话。

60 楼

#include <stdio.h>
#include <math.h>

/* 打印 */
void Print(int *arr,int *len) {
    for (;arr<len;printf("%5d",*arr++));
    printf("\n");
}
/* 判断 */
int IsCom(int *tmp) {
    int val_1,val_2,sv_1,sv_2;
    val_1=(*(tmp+1)-*tmp),val_2=(*(tmp+1)+*tmp);
    sv_1=(int)sqrt(val_1),sv_2=(int)sqrt(val_2);
    return (((sv_1*sv_1)==val_1)&&((sv_2*sv_2)==val_2));
}
/* 重点过程,该函数将找出指定范围内的所有符合要求的数 */
void Fun(int *arr,int *len,int *tmp,int index) {
    int *p=arr;
    if (p>len) return;
    index=0,*(tmp+index)=*p,index=1;
    for (p++;p<=len;p++) {
        *(tmp+index)=*p;
        if (IsCom(tmp)) Print(tmp,tmp+index+1);
    }
    Fun(arr+1,len,tmp,index);
}
/* main program */
#define    MAX    100
void main() {
    int a[MAX],i=0,left,right,tmp[2];
    for (;i<MAX;*(a+i)=i++);

    printf("输入范围(i j):");
    scanf("%d%d",&left,&right);
    Fun(a+left,a+right,tmp,0);
    getchar();getchar();
}
以上程序在vc6中通过

我来回复

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