回 帖 发 新 帖 刷新版面

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

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

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


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

回复列表 (共72个回复)

沙发


出来了!~~~~
(相关的判断如否输入是整数以及整数是否是在1-100之间等异常处理没有写就省了...)
#include<iostream>
#include<cmath>
using namespace std;

bool square(int n) //判断是否为平方数
{
    int x=sqrt(n);
    if(n==x*x) //如果能够相等就是平方数
        return true;
    return false;
}

int main()
{
    int x,y,temp,n=0; //n用来判断是否有解.
    cout<<"enter two numbers in 1 to 100: ";
    cin>>x>>y;
    if(x>y) {temp=x;x=y;y=temp;} //小的存在x,这样比较好循环
    for(int i=x;i<=y;i++)
        for(int j=i+1;j<=y;j++)
            if(square(j-i)&&square(i+j))
            {
                cout<<i<<" "<<j<<endl;
                n++;
            }
    if(!n)
        cout<<"no this number.."<<endl;
    return 0;
}

板凳

每个人都可以参加吗?

3 楼

我正在写呢,支持

两个相同的数不能算是自然数对吧!!!
否则楼主的答案就应该是:
2 2
8  8
4  5
6  10
了。

以上仅是我个人的看法。

4 楼

may i hava a chance?
aha, i will do my best!
here it is:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int isSame(int twoNumbers){
   int intValue;
   double doubleValue;
   doubleValue = sqrt(twoNumbers);
   intValue = doubleValue;
   return (doubleValue-intValue>0?1:0);
}

void main(){
     int a,b,i,j;
     int counter = 0;
     int tempValue;
     printf("Please enter two numbers between 1 and 100\n");
     scanf("a=%d,b=%d",&a,&b);
     if(a>b){
       tempValue = a;
       a=b;
       b=tempValue;
       }
      
        for(i = a;i <= b;i++) {
        for(j = i+1;j <= b;j++) {
            if(isSame(j-i) ==0&& isSame(i+j) == 0 ) {
                counter++;
                printf("%d %d\n",i,j);
           }
        }
      }
        printf("There are total %d pairs!",counter);
        if(counter==0) printf("Sorry,nothing found");  
        system("pause");
        return 0;   
}    
                   

5 楼

我用的是VC++
#include <stdio.h>
#include<math.h>
main()
{
    int i,j,n1,n2,n=1;
    printf("Input 2 numbers(1~100):");
    scanf("%d%d",&n1,&n2);
    for(;n1<1||n1>100||n2<1||n2>100;scanf("%d%d",&n1,&n2))
        printf("Input wrong! Input agagin(1~100):\n");
    if(n1>n2){i=n1;n1=n2;n2=i;}
    for(i=n1;i<n2;i++)
    for(j=i+1;j<+n2;j++)
       if(sqrt(i+j)==abs(sqrt(i+j))&&sqrt(j-i)==abs(sqrt(j-i)))
       {printf("\n%d  %d",i,j);n=0;}
    if(n)printf("\n No answer!\n");
}

6 楼

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

/* 15的平方已经超过200了 */
#define N 14

int p[N];
int pair[N*7][2];

int cmp(const void *a, const void *b)
{
    const int *pa = (const int *)a;
    const int *pb = (const int *)b;

    if (pa[0] == pb[0])
        return pa[1] - pb[1];
    return pa[0] - pb[0];
}

int main()
{
    int i, j ,t, a, b;
    for (i = 1; i < N+1; i++) /* 1..N的平方 */
    {
        p[i-1] = i * i;
    }
    for (t = 0, i = 0; i < N; i++)
    {
        for (j = i + 1; j < N; j++)
        {
            if ((p[j]^p[i]) & 1) /* 必须同奇偶性 */
                continue;

            pair[t][0] = (p[j]+p[i]) / 2;
            if (pair[t][0] < 100) /* a,b都不大于100 */
            {
                pair[t++][1] = (p[j]-p[i]) / 2;
            }
        }
    }
    
    qsort(pair, t, sizeof(int) * 2, cmp); /*排序,便于后面提早结束,不过这里只求一次,所以不做预处理排序更好... */
    
    if (scanf("%d%d", &a, &b) != 2) /* 如果题目是要求n组输入,那么前面的排序是要的 */
        return 0;

    if (a > b) i = a, a = b, b = i; /* 保证a<=b,a,b就是左右界了 */
    for (i = 0; i < t && pair[i][0] < a; i++) /* 按第一个数找到第一个满足条件的数对 */
        ;
    for (j = 0; i < t && pair[i][0] <= b; i++) /* 如果第一个数都不满足,那么就不必看第二个数了 */
    {
        if (pair[i][1] <= b && pair[i][1] >= a) /* 第二个数字也要满足条件 */
        {
            printf("%d %d\n", pair[i][1], pair[i][0]);
            j++;
        }
    }
    j || printf("no\n"); /* 如果无解,j=0输出no */

    return 0;
}

7 楼

这次加了注释哦。
我用的是VC++:
#include <stdio.h>
#include<math.h>
main()
{
    int i,j,n1,n2,n=1;//n为1表示无解,为0表示有解
    printf("Input 2 numbers(1~100):");
    scanf("%d%d",&n1,&n2);
    for(;n1<1||n1>100||n2<1||n2>100;scanf("%d%d",&n1,&n2))//提示错误的输入
        printf("Input wrong! Input agagin(1~100):\n");
    if(n1>n2){i=n1;n1=n2;n2=i;}//保证输入的数据是从小到大排列
    for(i=n1;i<n2;i++)
    for(j=i+1;j<+n2;j++)
       if(sqrt(i+j)==abs(sqrt(i+j))&&sqrt(j-i)==abs(sqrt(j-i)))
       {printf("\n%d  %d",i,j);n=0;}
    if(n)printf("\n No answer!\n");//结果判断
}

8 楼

呵呵,我没时间了,要上课了。
对自己很有信心,先投自己一票,没什么意见吧?!

9 楼

我用的是VC++

#include <stdio.h>
#include<math.h>
void main()
{
    int a,b,s,f,l;
        printf("Input two integrals:");
    scanf("%d%d",&a,&b);
    s=(a+b);
    f=(a-b);
    //k=(b+a);
    l=(b-a);
    
        if((a>1&&a<100)&&(b>1&&b<100))
        {
        if(sqrt(s)!=0&&s>=0)
         printf("%d,",s);
            
                
                if(sqrt(f)!=0&&s>=0)
                
                    printf("%d,",f);
                    
                        
                        //if(sqrt(k)!=0&&s>=0)
                        
                            //printf("%d,",k);
                            
                                
                                if(sqrt(l)!=0&&s>=0)
                                
                                    printf("%d,",l);
                                
                        
        }        
}

我是个初学者:)写的可能有点浅请大家谅解,我就是来学习的,希望大家能给点指点。呵呵估计肯定有错的地方,请大家帮我提出来,,谢谢:)


呵呵再三修改后应该是没问题了。已经调试过去了。

10 楼

#include <iostream.h>
bool sum(int m, int n);
void max(int &m, int &n);
void main()
{
    bool s=false;
    int m, n;
    do{
        cout << "please input two numbers(1~100)." << endl;
        cin >> m>> n;
    }while(m<=0||m>100||n<=0||n>100);
    max(m,n);
    for (int i=n; i<m; i++)
        for (int j=i+1; j<m+1; j++)
            if (sum(j,i))
            {
                cout << i << " " << j << endl;
                s=true;
            }
    if (!s) cout << n << "~" << m << " no anwser!" << endl;
    
}
void max(int &m, int &n)
{
    int temp;
    if (m<n)
    {
        temp = m;
        m = n;
        n = temp;
    }
}
bool sum(int m, int n)
{
    bool k1=false,k2=false;
    int s[]={1,4,9,16,25,36,49,64,81,100,121,144,169,196};
    //max(m,n);
    for (int i=0;i<14; i++)
        if ((m-n)==s[i]) {k1=true;break;}        
    for (int j=0;j<14; j++)
        if ((m+n)==s[j]) {k2=true;break;}
    if(k1&&k2) return true;
    return false;
}

我来回复

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