C语言实现素数,最小公倍数,最大公约数,回文数,质数,完数,水仙花数算法

来源:互联网 发布:小猪微信营销系统源码 编辑:程序博客网 时间:2024/05/22 13:05

1. 关于素数的算法:

用两个for循环,外循环是要求的范围,内循环是从2sqrt(外循环范围中的一个值+1);设置一个flag,来表明是否是素数;

具体实现:

#include <stdio.h>

#include <math.h>

int main (void)

{

int i, j;

bool flag = 0;                   //设立标志位,0表示非素数,1表示素数;

for(i = 101 ; i <= 200 ; i++)        //101~200的素数,并且打印出来;

{

for(j = 2 ; j <= sqrt((double)(i+1)) ; j++)

{

if(i % j == 0)

{

flag = 0;

break;

}

else

flag = 1;

}

if(flag)

printf("%d ", i);

}

return 0;

}

2. 关于水仙花数的算法:

主要是知道水仙花数的概念,然后分离出个位,十位和百位即可;

所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。

具体实现:

#include <stdio.h>

int main (void)

{

int i;

int baiwei, shiwei, gewei;

for(i = 100 ; i < 1000 ; i++)

{

int temp = 0;

gewei = i % 10;                    //分离个位;

shiwei = i / 10 % 10;                //分离十位;

baiwei = i / 100;                    //分离百位;

temp = gewei*gewei*gewei + shiwei*shiwei*shiwei + baiwei*baiwei*baiwei;

if(i == temp)

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

}

return 0;

}

3. 关于最大公约数和最小公倍数的算法:

最大公约数要求的是公约数中最大的那个,也就是公约数中最后的那一个;

最小公倍数要求的是公倍数中最小的那个,也就是公倍数中最开始的第一个。

具体实现:

#include <stdio.h>

int main (void)

{

int m, n, i, j;

int gcd, lcm;

printf("please input two integer\n");

scanf("%d %d", &m, &n);

for(i = 1 ; i < (m > n ? m : n) ; i++)

{

if(m % i == 0 && n % i == 0)

gcd = i;                               //获得最后一个公约数;

}

for(j = (m > n ? m : n) ; j <= m*n ; j++)

{

if(j % m == 0 && j % n == 0)

{

lcm = j;

break;                            //获得了一个公倍数就立即跳出循环;

}

}

printf("greatest common divisor is %d\n", gcd);

printf("Least Common Multiple is %d\n", lcm);

return 0;

}

4. 关于完数的算法:

定义:完数,即完美数,一个数如果恰好等于除它本身外的因子之和,这个数就称为完数。

具体实现:

#include <stdio.h>

int main (void)

{

int i, j, r;

for(i = 1 ; i <= 1000 ; i++)

{

r = 0;

for(j = 1 ; j < i ; j++)

{

if(i % j == 0)             //这一句是关键;

r = r + j;

}

if(r == i)

printf("perfect number is %d\n", r);

}

return 0;

}

5. 关于回文数的算法:

定义:"回文数"是一种数字。如:98789, 这个数字正读是98789,倒读也是98789,正读倒读一样,所以这个数字就是回文数。

算法实现:

#include <stdio.h>

#include <string.h>

int main (void)

{

char str[100];

char *pa, *pb;                 //使用指针实现;

printf("please input a string\n");

while(scanf("%s", str) != EOF)

{

pa = str;                  //指向第一个字符;

pb = str + strlen(str) - 1;     //指向最后一个不是(\0)字符;

while(*pa == *pb && pa < pb)

{

pa++;

pb--;

}

if(pa >= pb)                //是回文数;

printf("true\n");

else 

printf("false\n");

}

return 0;

}

6. 关于质数的算法:

定义:质数就是只能够被1和自身整除的数字,比如2,3,5,7,11......

算法实现:

#include <stdio.h>

int main (void)

{

int i, j;

bool flag = true;                              //设置标志位,默认为真;

for(i = 2 ; i <= 100 ; i++)

{

for(j = 2 ; j < i ; j++)

{

if(i%j != 0)

{

flag = true;                   //假如不能够被整除,则设置标志位为真;

}

else

{

flag = false;       //假如可以被整除,则设置标志位为假,同时退出循环;

break;

}

}

if(flag == true)                //标志位真时打印出数字;

printf("%d ", i);

}

return 0;

}