首先是一个定义:一对友好的数字由两个不同的整数组成 第一个整数的除数之和等于第二个整数,并且 第二个整数的除数之和等于第一个整数。完美数字是一个等于其自身除数之和的数字。
我想要做的是制作一个程序,要求用户提供下限和上限,然后向他/她提供这两个限制之间的所有友好对(每行一个)。如果有一个完美的数字,只需要打印一个数字(在它的情况下不是一对)。
整个想法让我很困惑,所以我正在寻求帮助。
这是我必须要做的,我知道sumDivisors()应该或多或少是正确的,但main()只是检查两个输入的数字是否友好 - 可能需要做完全彻底改革,因为我想要两个给定限制之间的所有对。
long sumDivisors(long a)
{
long s=0,i;
for(i=1;i<=a/2;i++)
{
if(a%i==0)
{
s+=i;
}
}
return s;
}
int main()
{
long t,n,s1;
scanf("%ld",&t);
while(t--)
{
scanf("%ld",&n);
s1=sumDivisors(n);
if(n==sumDivisors(s1))
{
printf("Yes\n");
}
else printf("No\n");
}
return 0;
}
答案 0 :(得分:1)
您可以像这样编写main():
int main ()
{
// assumes 1 <= min <= max
long min = 1;
long max = 10000;
for (long a = min; a <= max; a++) {
long b = sumDivisors (a);
if (a == b) {
printf ("perfect number:\t%ld\n", a);
}
if ((a < b) && (b <= max) && (sumDivisors (b) == a)) {
printf ("amicable pair:\t(%ld, %ld)\n", a, b);
}
}
return 0;
}
答案 1 :(得分:0)
回答:Hizbullah_Watandost
在范围之间找到友好对的最简单易懂的方法如下:
/ *
找到1到2000之间的友方对。如果你想要1到3000之间,只需改变for循环的检查条件(i和j <= 3000)。 你可以给出你想要的任何范围(通过改变循环的初始化和检查条件(外循环和内循环)。
click here to look at the flow chart for better understanding
* /
#include<stdio.h>
int main(){
int i,j;
//outer loop.
for (i=1;i<=2000;i++){
int d1=1;
int sum1=0;
while(d1<i){
if(i%d1==0){
sum1+=d1; //sum of divisors of i
d1++;
}else
d1++;
}
//inner loop
for(j=i+1;j<=2000;j++){
int d2=1;
int sum2=0;
while(d2<j){
if(j%d2==0){
sum2+=d2;//sum of divisors of j
d2++;
}else
d2++;
}
if(sum1==j && sum2==i)
//printing amicalbe pair.
printf("(%d , %d) \n",i,j);
}
}
return 0;
}
答案 2 :(得分:0)
大多数人可能会遇到问题,理解友好对是什么,让我通过示例220&amp; 284被认为是友好对,因为如果我们找到220的适当除数,我们得到(1,2,4,5,10,11,20,22,44,55和110)总结所有这些我们得到284现在,284的适当除数是(1,2,4,71和142),总结了我们得到的所有220.同样,1184的除数之和等于1210&amp; 1210的除数之和等于1184.现在,我们用C编写一个程序来查找10000范围内的所有友好对。
int main()
{
int n,k;
int i=1,s1=0,s2=0;
for(k=1;k<=10000;k++)
{
n=k;
while(i<n)
{
if(n%i==0)
s1=s1+i;
i++;
}
i=1;
if(s1==n)
continue;
while(i<s1)
{
if(s1%i==0)
s2=s2+i;
i++;
}
if(n==s2)
printf("%d \n",n);
s1=0;
s2=0;
}
}