C语言上机题目求解:在6至5000内找出所有的亲密数对,

若a.b为一对亲密数,a的因子和等于b,b的因子和等于a,且a不等于b... 若a.b为一对亲密数,a的因子和等于b,b的因子和等于a,且a不等于b 展开
 我来答
百度网友c19c0d0
2011-04-23 · TA获得超过1537个赞
知道小有建树答主
回答量:464
采纳率:0%
帮助的人:451万
展开全部
贴一个比楼上还要快的算法。嘿嘿~~!
不过C语言平常上机用不上太快的算法。
。。。。。。。。。。。。。。。。。。。。。。。

#include<stdio.h>
#define N 5001
int main()
{
int i,j;
int sum[N]; //用来储存i的因子和的数组。
int a,b;
int hh[N]; //用来做标记的数组。
for(i=1;i<N;i++)
sum[i]=hh[i]=1; //1是所有数的因子 所以sum初始为1。

for(i=2;i<N;i++)
for(j=i+i;j<N;j+=i) //找到所有i的倍数j
sum[j]+=i; //j的因子和 +i

for(i=6;i<N;i++)
{
a=sum[i]; //a为i的因子和。
if(a<N && sum[a]==i && hh[i] && a!=i)
{
printf("%d,%d\n",i,a);
hh[i]=hh[a]=0; //把i和a标记掉,防止输出两次。
}
}
return 0;
}
。。。。。。。。。。。。。。。。。。。。。。。。。
这样 一对亲密数 就输出了两次。。

#include<stdio.h>
#define N 5001
int main()
{
int i,j;
int sum[N]; //用来储存i的因子和的数组。
int a,b;
int hh[N]; //用来做标记的数组。
for(i=1;i<N;i++)
sum[i]=1; //1是所有数的因子 所以sum初始为1。

for(i=2;i<N;i++)
for(j=i+i;j<N;j+=i) //找到所有i的倍数j
sum[j]+=i; //j的因子和 +i

for(i=6;i<N;i++)
{
a=sum[i]; //a为i的因子和。
if(a<N && sum[a]==i && a!=i)
{
printf("%d,%d\n",i,a);
}
}
return 0;
}
sun_siliang
推荐于2018-03-14 · TA获得超过2.6万个赞
知道大有可为答主
回答量:9913
采纳率:100%
帮助的人:4607万
展开全部
//电脑速度慢的话,请将5000改为1000。
#include<stdio.h>
void main()
{
int getsum(int n);
int x,y;
for(x=6;x<5000;x++)//电脑速度慢的话,请将5000改为1000。
for(y=6;y<5000;y++)//电脑速度慢的话,请将5000改为1000。

if((x==getsum(y))&&(y==getsum(x))&&x!=y)
printf("%-5d%-5d%\n",x,y);
}
int getsum(int n)

{
int i,a=1;
for(i=2;i<=n/2;i++)
if(!(n%i))
a=a+i;
return a;
}
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友1305448
2017-07-31 · TA获得超过443个赞
知道小有建树答主
回答量:204
采纳率:100%
帮助的人:122万
展开全部
#include<stdio.h>
int x_sum(int x)
{//求因子和
int r = 1;
for (int i=2; i<=x/2; i++)
if (x % i == 0)
r = r + i;
return r;
}

int main()
{
int a = 0;
int b = 0;
for (int i=6; i<=5000; i++)
{
a = x_sum(i);
for (int j=i+1; j<=5000; j++)
{
b = x_sum(j);
if (a == j && b == i)
{//亲密数判断条件
printf("%d 是 %d 的亲密数\r\n", i, j);
}
}
}
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
伍拾步
2011-04-23 · TA获得超过8199个赞
知道大有可为答主
回答量:1852
采纳率:100%
帮助的人:1937万
展开全部
LS算法不好,速度太慢
#include<stdio.h>
#define Max 5000
void main()
{
int a=5,i,j,s,m;
do{
a++;
s=1;
for(i=2;i<=a/2;i++)if(a%i==0)s=s+i;
if(s<=a||s>Max)continue;
m=1;
for(j=2;j<=s/2;j++) if(s%j==0)m=m+j;
if(m==a)printf("%d,%d\n",a,s);
}while(a<=Max);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
癯月笑浮生
2017-08-08 · TA获得超过2795个赞
知道小有建树答主
回答量:2657
采纳率:76%
帮助的人:446万
展开全部
surface不在身边,敲不了。。。说下思路吧,嵌套for循环,定义一个函数求因子和,然后用if判断
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式