C - 查找限制之间的所有友好数字

时间:2015-02-01 20:58:13

标签: c range limit

首先是一个定义:一对友好的数字由两个不同的整数组成 第一个整数的除数之和等于第二个整数,并且 第二个整数的除数之和等于第一个整数。完美数字是一个等于其自身除数之和的数字。

我想要做的是制作一个程序,要求用户提供下限和上限,然后向他/她提供这两个限制之间的所有友好对(每行一个)。如果有一个完美的数字,只需要打印一个数字(在它的情况下不是一对)。

整个想法让我很困惑,所以我正在寻求帮助。

这是我必须要做的,我知道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;
} 

3 个答案:

答案 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;
       }
    }