2011年第一題
阿新 • • 發佈:2019-01-09
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; }