| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 729 人关注过本帖
标题:the problem i don`t understand
只看楼主 加入收藏
science
Rank: 1
等 级:新手上路
帖 子:63
专家分:0
注 册:2006-11-22
收藏
 问题点数:0 回复次数:8 
the problem i don`t understand

如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。编程,输出3000以内的全部亲密数。
以下是我的程序,不过,运行后,不出现任何结果。不是很明白/
main()
{ int i,j,m,n,sum1=0,sum2=0;
for(i=1;i<=3000;i++)
{for(j=1;j<=3000;j++)
{m=2;
while(m<=i)
{if(i%m==0)
sum1+=i/m;
m++;
}
n=2;
while(n<=j)
{if(j%n==0)
sum2+=j/n;
n++;
}
if((sum1==j)&&(sum2==i))
printf("%d %d",i,j);
}
}
getch();

}

[此贴子已经被作者于2006-12-1 20:37:56编辑过]

搜索更多相关主题的帖子: problem understand don 
2006-12-01 20:37
applegrape
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2006-11-25
收藏
得分:0 

我也试着编了一下,在小范围内(如100以内),这种算法还是能够解决的,但是3000以内,就慢的很了。应该还有好的算法。
#include<stdio.h>
#include<math.h>
#define N 100
void main()
{
int sumA=0 ,sumB=0;

for(int i=3;i<=N;i++)
{
for(int j=3;j<N;j++)
{
sumA=0; sumB=0;
for(int i1=2;i1<i;i1++)// i 的因数的和
if(i%i1==0) sumA+=i1;

for(int i2=2;i2<j;i2++) // j的因数的和
if(j%i2==0) sumB+=i2;

if(sumA==j && sumB==i) printf("%d,",i);
}

}
}

2006-12-01 21:25
applegrape
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2006-11-25
收藏
得分:0 
忘了说了,1楼的:在求每个数的因数的和时,sum要恢复为0才可以,要不然sum会一直加下去,sum1 和sum2当然不会相等,因此没有结果输出。
2006-12-01 21:29
zhouweike
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2006-9-23
收藏
得分:0 

你编的这个程序效率十分低,况且你在开始sum1=0,sum2=0,但你的程序j每次变化以后,sum1和sum2没有恢复到0,着就肯定有问题了.看看这个 是不是比你的效率高一些:
# include <stdio.h>
int f(int n)
{ int s,k;
for(k=2,s=1;k<=n/2;k++)
if(n%k==0) s=s+k;
return s;
}
void main()
{
int m,p,q;
for(m=2;m<=3000;m++)
{
p=f(m);
q=f(p);
if(q==m&&m<p)
printf("%d<--->%d\n",m,p);
}
}


2006-12-01 21:55
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

根据楼主的意思,我也编了一个.

#include<stdio.h>

long sum(long num)//这个函数的效率还可以提高一点的.
{
long i=1,sum=0;
while(i<num)//
{
if(num%i==0)
{
sum+=i;//这个再加个sum+=num/i;当然循环变量里会缩短.
}
i++;
}
return sum;
}

int main()
{
long i=2;
while(i<=3000)
{
if(sum(sum(i))==i)
{
printf("%ld\n",i);
}
i++;
}
return 0;
}


倚天照海花无数,流水高山心自知。
2006-12-01 21:57
iimiss
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2006-11-28
收藏
得分:0 

楼上的 你的程序一点层次都没有 这样不好看呢 而且你自己运行下 好像也不太对哦
看看我的 不过效率好像也不高

#include<stdio.h>
main()
{ int i,j,m,n,sum1=0,sum2=0;
for(i=1;i<=3000;i++)
{
m=2;
while(m<=i)
{if(i%m==0)
sum1+=i/m;
m++;
}
for(j=1;j<i;j++)
{
n=2;
while(n<=j)
{if(j%n==0)
sum2+=j/n;
n++;
}

if((sum1==j)&&(sum2==i))
printf("%d %d",i,j);

sum2=0;
}
sum1=0;
}
}

2006-12-01 22:02
science
Rank: 1
等 级:新手上路
帖 子:63
专家分:0
注 册:2006-11-22
收藏
得分:0 
4楼和5楼的最好了,
看来函数的调用以后还要多用!
多谢了!!

2006-12-01 22:06
science
Rank: 1
等 级:新手上路
帖 子:63
专家分:0
注 册:2006-11-22
收藏
得分:0 
不过5楼的运行目的,和题目要求的不是很一样了。你是输出了一个完数。
而并非题目中的要求。
4搂的不错。

2006-12-01 22:21
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
以下是引用science在2006-12-1 22:21:44的发言:
不过5楼的运行目的,和题目要求的不是很一样了。你是输出了一个完数
而并非题目中的要求。
4搂的不错。

麻烦你先运行检验一下好不好.
220 --->1+2+110+4+55+5+44+10+22+11+20=284--->1+2+142+4+71=220

我只是没有把两个数都输出.
if(sum(sum(i))==i)

一次做sum(i)是表示i的所有在[1,i)区间内的因子之和,假设等于j.
第二次sum(j)表示j的所有在[1,j)区间内的因子之和.假设等于k.

这里如果k==i,就说明i和k是亲密数.此时不就是sum(sum(i))和i是亲密数了.


倚天照海花无数,流水高山心自知。
2006-12-02 11:00
快速回复:the problem i don`t understand
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025536 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved