【问题标题】:C - Find all amicable numbers between limitsC - 找出限制之间的所有友好数字
【发布时间】:2015-02-01 20:58:12
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我认为任何时候你的家庭作业涉及你不熟悉的数学,你应该查看维基百科。这是快速了解en.wikipedia.org/wiki/Amicable_numbers 概念的好方法。请特别注意文章中的示例,这些示例应该可以帮助您解决范围问题。
  • 这实际上是我从中得到定义的地方,尽管仍然坚持如何将它实际用作一个范围而不是使用两个数字来检查。

标签: c range limit


【解决方案1】:

你可以这样写 main():

int main ()
{
    // assumes 1 <= min <= max                                                                
    long min = 1;
    long max = 10000;

    for (long a = min; a <= max; a++) {
        long b = sum_of_proper_divisors (a);
        if (a == b) {
            printf ("perfect number:\t%ld\n", a);
        }
        if ((a < b) && (b <= max) && (sum_of_proper_divisors (b) == a)) {
            printf ("amicable pair:\t(%ld, %ld)\n", a, b);
        }
    }

    return 0;
}

【讨论】:

  • 感谢您的帮助!我可以看到现在发生了什么,并且刚刚修复了我的原始代码。
【解决方案2】:

在一个范围之间找到友好对的最简单和易于理解的方法如下:

找到 1 到 2000 之间的友好对。如果你想要 1 到 3000 之间,只需改变 for 循环的检查条件(i 和 j

#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;
}

【讨论】:

    【解决方案3】:

    你们中的大多数人可能在理解什么是友好配对时遇到问题,让我通过一个例子来解释一下 220 和 284 被称为友好配对,因为如果我们找到 220 的正确除数,我们得到 (1, 2, 4, 5 , 10, 11, 20, 22, 44, 55 & 110) 将它们加起来我们得到 284。现在,284 的正确除数是 (1, 2, 4, 71 & 142) 220. 同理,1184的因数之和等于1210,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;
           }
        }
    

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 2019-01-13
      • 1970-01-01
      • 2017-04-17
      • 1970-01-01
      • 2013-06-08
      • 2021-12-04
      • 1970-01-01
      相关资源
      最近更新 更多