本篇主要介绍C语言中求自首数、完数和自然常数e的求解算法
一、求自首数
1、自首数:
自守数是指一个数的平方的尾数等于该数自身的自然数。
自首数是按位数来分的:三位自守数是625和376,四位自守数是0625和9376,五位自守数是90625和09376…
比如:
5和6是一位自守数(5x5=25 6x6=36)
25x25=625 76x76=5776,所以25和76是两位自守数。
2、题:
用C语言算法求解100000内的所有自首数
3、参考代码:
#include <stdio.h>
main()
{
int i, m, temp;
printf("100000内的自首数有以下:");
for(i=1; i<=100000; i++)
{
temp = i*(i-1);
m = 1;
//得到某个数的尾数
while(m<=i)
m *= 10;
if(temp%m == 0)
printf("%d ",i);
}
printf("\n");
}
4、参考结果:
二、求完数
1、完数(完全数)
From“科普中国”
完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
如果一个数恰好等于它的因子之和,则称该数为“完全数”。第一个完全数是6,第二个完全数是28,第三个完全数是496,后面的完全数还有8128、33550336等等。
2、参考代码:
#include <stdio.h>
#include <math.h>
int main()
{
int i, j, sum;
for(i=2; i<1000; i++)
{
sum = 0;
for(j=1; j<=i/2; j++)
{
if((i%j) == 0)
{
sum += j;
}
if(sum==i)
{
printf("%d是完数,它的因子有:",i);
for(j=1; j<=i/2; j++)
{
if((i%j)==0)
{
printf("%d ",j);
}
}
printf("\n");
}
}
}
}
3、参考结果:
三、求亲密数
1、亲密数:
如果a的所有正因子和等于b,b的所有正因子和等于a, 因子包括1但不包括本身, 且a不等于b,则称a,b为亲密数对。一般通过叠代编程求出相应的亲密数对。
2、题:
用C语言编程求出5000内的亲密数对
3、分析:
(1)通过从1循环到5000,对每一个数进行判断,看其是否有亲密数,如果有则输出这个亲密数;
(2)判断是否有亲密使数的方法:先求出某数i的因子之和sum,再求出sum的因子之和;
(3)如果i的因子之和等于sum的因子之和,且i不等于sum,则sum就是i的亲密数
4、参考代码:
#include <stdio.h>
int main()
{
int i, j, sum1, sum2, n; //sum1是i的亲密数,sum2是sum1的亲密数
printf("您需要计算多少内的亲密数:");
scanf("%d",&n);
printf("%d内的亲密数有:",n);
//核心算法
for(i=1;i<=n;i++)
{
sum1 = 0; //每循环一轮都将求和变量置为0
sum2 = 0;
//求i的因子之和sum1
for(j=1;j<i;j++)
{
if(i%j==0) //取余等于0则为一个因子
{
sum1 += j;
}
}
//求sum1的因子之和sum2
for(j=1;j<sum1;j++)
{
if(sum1%j==0)
{
sum2 += j;
}
}
//判断i的因子和是否等于sum1的因子和
if((sum2==i) && (i!=sum1) && (i<sum1))
//表示i的因子和等于sum1,而sum1的因子和等于i,则为亲密后
//后两个判断是为了增强程序的容错性,表示这对亲密数不能是相等的数,且前者小于后者
{
printf("\t%d与%d",i,sum1); //输出这对亲密数
}
}
}
5、参考结果: