問題 G: 親和數
題目描述
如果a的因子和等於b,b的因子和等於a,且a≠b,則稱a,b爲親密數對。比如220的所有真約數(即不是自身的約數)之和爲: 1+2+4+5+10+11+20+22+44+55+110=284。 284的所有真約數和爲: 1+2+4+71+142=220。你的任務就編寫一個程序,判斷給定的兩個數是否是親和數
輸入
輸入數據第一行包含一個數M,接下有M行,每行一個實例,包含兩個整數A,B; 其中 0≤A,B≤99999。
輸出
對於每個測試實例,如果A和B是親和數的話輸出YES,否則輸出NO。
#include <iostream>
using namespace std;
int main()
{
int a,b,m,n,i,j=1,s,t;
cin>>m;
for(n=1; n<=m; n++)
{
cin>>a>>b;
if(a==b)
continue;
else
{
t=0;
for(i=1; i<a; i++)
{
if(a%i==0) t=t+i;
}
s=0;
for(j=1; j<b; j++)
{
if(b%j==0) s=s+j;
}
if(t==b&&s==a) cout<<"YES"<<'\n';
else cout<<"NO"<<'\n';
}
}
return 0;
}
判斷是否是親和數,需要先求出兩個數的所有因子,並求和,看和是否相等,求和與輸入多組數據都需要用循環語句;
題目要求中明確指出,輸入的兩個數不能相等,所以,輸入完兩個數之後(cin>>a>>b;),我們還要判斷一下這兩個數是否相等,如果相等(if(a==b)),就終止此次預算,繼續進行下一次循環(continue;);如果不相等(else),就繼續,先求出第一個數的真因子之和(t=0; for(i=1; i<a; i++) { if(a%i==0) t=t+i; }),再求出第二個數的真因子之和(s=0; for(j=1; j<b; j++) { if(b%j==0) s=s+j; });
如果滿足親和數的條件(if(t==b&&s==a)),就輸出是(cout<<"YES"<<'\n';),否則(else),就輸出否(cout<<"NO"<<'\n';)!