C - 找到限制之间的所有友好数字
C - Find all amicable numbers between limits
首先是一个定义:一对友好的数字由两个不同的整数组成,其中
第一个整数的除数之和等于第二个整数,并且
第二个整数的除数之和等于第一个整数。完美数是等于其自身除数之和的数。
我想做的是制作一个程序,要求用户提供下限和上限,然后显示 him/her 这两个限制之间的所有友好对(每行一个)。如果有一个完美的数字,只需要打印一个数字(在这种情况下不是一对)。
整个想法让我很困惑,所以我正在寻找一些帮助。
这是我必须开始的,我知道 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;
}
你可以这样写 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;
}
在范围内找到友好配对的最简单易懂的方法如下:
find amicable pairs between 1 to 2000.if you want between 1 to 3000 , just bring changes in the checking condition of for loops( i and j <= 3000).
You can give whatever range you want (by changing the initialization and checking conditions of the loops(outer loop and inner loop) .
#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;
}
你们中的大多数人可能难以理解友好对是什么,让我通过一个例子来解释一下 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;
}
}
首先是一个定义:一对友好的数字由两个不同的整数组成,其中 第一个整数的除数之和等于第二个整数,并且 第二个整数的除数之和等于第一个整数。完美数是等于其自身除数之和的数。
我想做的是制作一个程序,要求用户提供下限和上限,然后显示 him/her 这两个限制之间的所有友好对(每行一个)。如果有一个完美的数字,只需要打印一个数字(在这种情况下不是一对)。
整个想法让我很困惑,所以我正在寻找一些帮助。
这是我必须开始的,我知道 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;
}
你可以这样写 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;
}
在范围内找到友好配对的最简单易懂的方法如下:
find amicable pairs between 1 to 2000.if you want between 1 to 3000 , just bring changes in the checking condition of for loops( i and j <= 3000). You can give whatever range you want (by changing the initialization and checking conditions of the loops(outer loop and inner loop) .
#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;
}
你们中的大多数人可能难以理解友好对是什么,让我通过一个例子来解释一下 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;
}
}