c语言10到10000的相亲数,关于“相亲数”的算法实现

“相亲数”的介绍

在数学中,“相亲数”是指一对“你中有我,我中有你”的数字,其特点是:

彼此的全部约数和(本身除外)与另一方相等。

例如:220和284就是一对相亲数。

220的全部约数和(除掉220本身)相加是:

1+2+4+5+10+11+20+22+44+55+110 = 284

同样,284的全部约数(除掉284本身)相加的和为:

1+2+4+71+142 = 220

关于“相亲数”的研究从古至今都未曾中断过,这篇文章是我将老师所讲的提炼一下并给出拓展的算法。

C语言的算法实现

#define N 10000

main()

{

int i,j,k; unsigned s[N];

clrscr();//清屏

for(i=2;i

for(i=2;i

for(j=i+1;j

if((i==s[j])&&(j==s[i]))

{

printf("%d: ",i);

for(k=1;k

printf("%d: ",j);

for(k=1;k

}

}

上面的代码只需要导入函数库,即在开头加上include 就可运行。

程序用来输出10000以内的相亲数,运行结果如下:

7f3af99dbb6fc53111f38ced197247a5.png

算法分析

首先声明变量,其中变量名为s的表示含有N个无符号类型数据的数组。然后两个for循环用来计算10000以内每个数的所有约数和,并放入数组中。下面两个for中j变量的初始值为i+1,这是为了防止出现220,284和284,220的重复情况,if语句判断是否约数和等于对方,printf语句输出整个过程。

下面给出j初始值为2的运行结果:

8e71bc652423def93e8317201e090769.png

以上只是截取了一部分,可以看出有重复的情况,并且运行时间要比原来的久,效率低。

修改版

下面是我们老师布置的作业,要求将后面的两个for循环变成一个循环,我的思路是用一个循环遍历数组下标,同时将数组中每个值赋给另一个变量,这个变量也作为下标来做判断,具体算法如下:

#define N 10000

main()

{

int i,j,k; unsigned s[N];

clrscr();//清屏

for(i=2;i

for(i=2;i

{

j=s[i];

if(j>N) continue;//①

if(i==s[j]&&j>i)

{

printf("%d: ",i);

for(k=1;k

printf("%d: ",j);

for(k=1;k

}

}

}

一开始代码中的①处我写在了下面的for循环中,结果这样在i为5000多的某处会导致j的值超过一万,数组下标越界,后来单独写出来就行了。运行结果与第一次结果相同。

其实随着N的值的增加,数组的开销会很大,运行结果的时间会很长,效率很低,目前没有想到更好的算法,以后想到了再补充。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 请问这是什么题目? 答:这是一道数学题。它描述了2500年前,数学大师毕达哥拉斯发现了220和284两个数之间存在着奇妙的联系:220的真因数之和为1+2+4+5+10+11+20+22+44+55+110=284,而284的真因数之和为1+2+4+71+142=220。这个性质被称为“亲和数”(amicable numbers)。 ### 回答2: 为:1 2 4 71 142=220\n这两个数被称为亲密数,也叫友好数、相亲数,它们是指两个正整数,它们的真因数之和中,其中一个数恰好等于另一个数。\n亲密数是数学领域中非常有趣的问题,因为它们很难被发现。直到毕达哥拉斯发现了220和284这一组亲密数,人们才开始关注这个问题。\n从数学角度来看,亲密数属于数论范畴,是一种关于整数因子的研究。\n亲密数的发现不仅能够让人们学习到数学知识,也能够拓宽人们的视野。通过研究亲密数,我们可以了解数学的奥妙和深度,同时也可以了解人类思考问题的过程和方法。\n亲密数的应用还十分广泛,它在密码学、计算机科学和通信技术等领域都有着重要的应用。例如,计算机程序中就会用到亲密数来判断某个数是否为质数,还可以用亲密数来检测错误数据,以保证信息传递的正确性。\n因为亲密数的研究有着广泛的应用和深刻的理论意义,所以我们应该重视这个问题,并在实际生活中灵活运用它。无论是在数学学习还是在日常生活中,我们都可以通过研究亲密数,不断开拓自己的思维和知识之路。 ### 回答3: 为:1 2 4 71 142=220 这两个数被称为亲密数,也就是说,它们彼此之间有一种神秘的联系。亲密数被认为是数论中最古老的问题之一,也是最为奇妙的数学之谜。 亲密数一般指两个正整数,它们的所有真因数之和相等,但是亲密数的寻找并不容易。目前已知的亲密数对只有几对,其中最小的一对是(220,284),一直到目前最大的一对(9,363,584,551,052,146,816,624, 000,001, 10, 9, 10, 472, 2, 56, 2)。 尽管亲密数的规律并不十分清楚,但是我们在实际应用中也是能够应用亲密数的。比如,亲密数可以用来加密,通过对两个亲密数的乘积进行加密和解密,可以达到一定的保密效果,这也是亲密数又被称为公钥密码的原理之一。 除此之外,亲密数在解决某些数论难题上也具有重要的意义。通过对亲密数的深入研究,人们也能够更好地理解数论中的一些基本概念和原理。 总的来说,亲密数虽然看似神秘而难以理解,但是在实际应用和数学研究中却扮演着非常重要的角色,也是我们在学习数学的过程中需要了解和掌握的内容之一。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值