完数/最大公约数/最小公倍数/素数/回文数

本文详细介绍了如何使用C语言实现完全数、最大公约数、最小公倍数及素数的判断算法,并通过实例展示了具体的实现过程。

1.一个正整数的因子是所有可以整除它的正整数。而一个数如果恰好等于除它本身外的因子之和,这个数就称为完数。例如6=1+2+3(6的因子是1,2,3)。

#include <stdio.h>
#include <math.h>
int IsPerfect(int x);
int main()
{
    int m;
    printf("Input m:");
    scanf("%d", &m);

    if (IsPerfect(m))  /* 完全数判定 */
        printf("%d is a perfect number\n", m);
    else
        printf("%d is not a perfect number\n", m);
    return 0;
}


/* 函数功能:判断完全数,若函数返回0,则代表不是完全数,若返回1,则代表是完全数 */
int IsPerfect(int x)
{
    int i;
    int total = 0;          /* 1没有真因子,不是完全数 */

    for (i=1;i<x;i++)
    {
        if (x%i==0)
            total = total + i;
    }
    return total==x ? 1 : 0;
}

2.设计一个函数MaxCommonFactor()利用辗转相除法计算两个正整数的最大公约数

#include <stdio.h>
int MaxCommonFactor(int a, int b);
int main()
{
     int a, b, x;
     printf("Input a,b:");
     scanf("%d,%d", &a, &b);
     x =MaxCommonFactor(a,b);

     if (x != -1)
     {
          printf("MaxCommonFactor = %d\n", x);
     }
     else
     {
          printf("Input error!\n");
     }

     return 0;
}

//函数功能: 计算两个正整数的最大公约数,-1表示没有最大公约数
int MaxCommonFactor(int a, int b)
{
     int r;
     if (a<=0 || b<=0) return -1; // 保证输入的参数为正整数

     do{
          r=a%b;
          a = b;
          b = r;
     }while (r!=0);

     return  a;
}
//函数功能: 计算两个正整数的最大公约数,递归版本
<pre name="code" class="cpp"><p>int <span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;"><strong>MaxCommonFactor</strong></span>(int a,int b)</p>{
    int r;
    if(a<0 || b<0) return -1;
    if(b==0)
        r=a;
    else
        r=Gcd(b,a%b);
    return r;
}

另一种版本:

int divisor(int a,int b)
{
	int x = a<b?a:b;  //求a,b的最小数 
	while(x)
	{
		if(a%x==0 && b%x==0)
			break;
		--x;	
	}
	return x;
}




3.设计一个函数MinCommonMultiple(),计算两个正整数的最小公倍数

#include <stdio.h>
int MinCommonMultiple(int a, int b);
int main()
{
    int a, b, x;
    printf("Input a,b:");
    scanf("%d,%d", &a, &b);
    x = MinCommonMultiple(a,b);

    if (x!=-1)
        printf("MinCommonMultiple = %d\n", x);
    else
        printf("Input error!\n");

   return 0;
}
//函数功能:计算两个正整数的最小公倍数,-1表示没有最小公倍数
int MinCommonMultiple(int a, int b)
{
    int i;

    if (a<=0 || b<=0) return -1;        // 保证输入的参数为正整数

    for (i=1; i<b; i++)
    {
        if ((i*a)%b==0)   return i * a;
    }

    return b * a;
}

4.设计一个函数,用来判断一个整数是否为素数

#include <math.h>
#include <stdio.h>
int IsPrimeNumber(int number);
int main()
{
     int n, ret;
     printf("Input n:");
     scanf("%d", &n);
     ret = IsPrimeNumber(n);
     if (ret!=0)
     {
          printf("%d is a prime number\n", n);
     }
     else
     {
          printf("%d is not a prime number\n", n);
     }
     return 0;
}
//函数功能:判断number是否是素数,函数返回非0值,表示是素数,否则不是素数
int IsPrimeNumber(int number)
{
     int i;

     if (number <= 1) return 0; // 负数、0和1都不是素数
         for (i=2; i<sqrt(number); i++)
         {
              if (number%i==0) // 被整除,不是素数
                  return 0;
     }
     return 1;
}


来自哈尔滨工业大学MOOC课件

5.回文数

输出所有不超过n(取n<256)的、其平方具有对称性质的正整数(也称为回文数)。

如:  1*1=1; 2*2=4;3*3=9;11*11=121;1,2,3,11是回文数。


#include <stdio.h>
#include <stdbool.h>
bool isPalindrome(int num);
bool isPalindrome(int num)  //判断回文数字
{
    int pal = 0;
    int origin = num;

    while(num)
    {
        pal *= 10;
        pal += num % 10;
        num /= 10;
    }

    return pal == origin;
}
int main()
{
    int n,i;
    scanf("%d",&n);
    for(i=1;i<n;i++)
    {
        if(isPalindrome(i*i) && i<256)  //打印回文数字
            {
                printf("%d\n",i);
            }
    }

   return 0;
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值