用c 语言设计一个相亲系统,C趣味程序(二)(12)求4位以内的相亲数

39f958c39a410b139a2a5c9aa9aefd4f.png

2.6 相亲数

2500年前数学大师毕哥达拉斯就发现,220与284两数之间存在着微妙的联系:

220的真因数之和为:1+2+4+5+10+11+20+22+44+55+110=284

284的真因数之和为:1+2+4+71+142=220

毕达哥拉斯把这样的数对A,B称为相亲数:A的真因数之和为B,而B的真因数之和为A。

相亲数的直接推广是相亲数链:呈连环套形式的多个相亲数。例如,A的真因数之和为B,B的真因数之和为C,C的真因数之和为D,最后D的真因数之和又为A,则A,B,C,D称为一个4环相亲数链。

数学界寻找相亲数与相亲数链,竟相打破相亲数记录的热情不减。

2.6.1 求4位以内的相亲数

1.算法分析

对指定区间中的每一个整数i应用试商实施穷举判别。根据相亲数的定义,用试商法(i mod j=0)找出i的所有小于i的真因数j,并求出真因数的和s。然后用同样的方法找出整数s的真因数之和s1。如果有s1=i,则i,s为相亲数对。

为减少试商j循环次数,注意到数i若为非平方数,它的大于1小于i的因数成对出现,一对中的较小因数要小于i的平方根。若数i愉为整数t的平方,此时t为i的一个因数,而不是一对,因而在和s中减去多加的因数t,这样试商j循环只要从2取到i的平方根t=SQR(i),可大减少j循环次数。缩减程序的运行时间。最后按规格打印所找出相亲数。

程序代码如下:

/*求4位以内的相亲数*/

#include#includevoid main()

{

int i,j,s,t,s1;

for(i=11;i<=9999;i++)

{

s=1;t=sqrt(i);

for(j=2;j<=t;j++) if(i%j==0) s=s+j+i/j;

if(i==t*t)s-=t; /*求i的真因数之和s*/

if(i{

s1=1;t=sqrt(s);

for(j=2;j<=t;j++) if(s%j==0) s1=s1+j+s/j;

if(s==t*t) s1-=t; /*求s的真因数之和s1*/

if(s1==i)

{

printf("相亲数:%d,%d\n",i,s);

printf("%d的真因数之和为:1",i); /*规格打印相亲数*/

for(j=2;j<=i/2;j++) if(i%j==0) printf("+%d",j);

printf("=%d\n",s);

printf("%d的真因数之和为:%d",s,1);

for(j=2;j<=s/2;j++) if(s%j==0) printf("+%d",j);

printf("=%d\n",i);

}

}

}

}

2829f2ca24f0d0090cbba57f30759f23.png

C趣味程序(二)(12)求4位以内的相亲数.doc

下载Word文档到电脑,方便收藏和打印[全文共1038字]

编辑推荐:

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

下载Word文档

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值