1. 程式人生 > >2011年第一題

2011年第一題

11年上機題

1. 【問題描述】

孿生數定義: 如果 A 的約數(因數,包含1,但不包含A本身)之和等於 B , B 的約數(因數)之和等於 A , A 和 B 稱為孿生數(A和B不相等)。試找出正整數 M 和 N 之間的孿生數。

輸入:

從控制檯輸入兩個正整數M和N(1<=M<N<=20000),中間用一個空格分隔。

輸出:

在標準輸出上輸出符合題目描述的M和N之間的全部孿生數對(包括M和N)。每行輸出一對孿生數,用一個空格隔開,小的先輸出;各行孿生數按照第一個數從小到大的順序輸出,一對孿生數只輸出一次。 如果沒有符合要求的孿生數對,則輸出字串“NONE”。

輸入樣例

20 300

200 250

輸出樣例

220 284

NONE

樣例說明

樣例1輸入的區間為[20,300],其間有一對孿生數對,即:220(1+2+4+5+10+11+20+22+44+55+110=284)和284(1+2+4+71+142=220)。樣例2輸入的區間是[200,250],其間沒有孿生數對,所以輸出字串:NONE。

評分標準

該題要求輸出區間中的所有孿生數對,共有5個測試點,提交程式檔名為example1.c或example1.cpp。

 

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

int getsum(int n)
{
    if(n==1)return 0;
    int sum=1;
    for(int i=2;i<=n/2;i++)
        if(n%i==0)
        sum+=i;
    return sum;
}

int main()
{
    int m,n;
    int minn,maxn;
    int flag;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        flag=0;
        minn=(m>n)?n:m;
        maxn=(m>n)?m:n;
        for(int i=minn;i<=maxn;i++)
            for(int j=i+1;j<=maxn;j++)
            {
                int p=getsum(i);
                int q=getsum(j);
                if(p==j&&q==i)
                {
                    flag=1;
                    printf("%d %d\n",i,j);
                }
            }
        if(flag==0)
            printf("NONE\n");
    }
    return 0;
}