【MOOC选择题中的编程题】辗转相除法、完全数、最大公约数、最小公倍数、组合数

题目:
设计一个函数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;   
}

用递归做辗转相除也合适。

int Gcd(int a, int b)
{
    if (a%b == 0)
        return b;
    else
        return Gcd(b, a%b);
}

题目:
完全数,又称完美数或完数(Perfect Number),它是指这样的一些特殊的自然数,它所有的真因子(即除了自身以外的约数)的和,恰好等于它本身。例如,6就是一个完全数,是因为6 = 1 + 2 + 3。请编写一个判断完全数的函数IsPerfect(),然后判断从键盘输入的整数是否是完全数。注意:1没有真因子,所以不是完全数。
程序:

#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;     
}

题目:
根据最大公约数的如下3条性质,采用递归法编写计算最大公约数的函数Gcd(),在主函数中调用该函数计算并输出从键盘任意输入的两正整数的最大公约数。
性质1 如果a>b,则a和b与a-b和b的最大公约数相同,即Gcd(a, b) = Gcd(a-b, b)
性质2 如果b>a,则a和b与a和b-a的最大公约数相同,即Gcd(a, b) = Gcd(a, b-a)
性质3 如果a=b,则a和b的最大公约数与a值和b值相同,即Gcd(a, b) = a = b
要求如下:
(1)从键盘任意输入的两整数
主函数调用Gcd()函数,并输出两整数的最大公约数。
(2)Gcd函数原型为:
int Gcd(int a, int b);
如果输入的数不是正整数,则返回-1,否则,返回两个数的最大公约数。
(3)**输入提示信息格式要求:“Input a,b:”
输入格式:"%d,%d"
**输出提示信息要求:
若输入不是正整数,则输出"Input number should be positive!\n"
否则输出"Greatest Common Divisor of %d and %d is %d\n"
注:不允许使用goto语句

程序:

#include <stdio.h>
#include <stdlib.h>
int Gcd(int a, int b);

int Gcd(int a, int b)
{
    if (a>b)
        return Gcd(a-b, b);
    else if (b>a)
        return Gcd(a, b-a);
    else if (a==b)
        return a ;
}

int main()
{
    int a,b,s;
    printf("Input a,b:");
    scanf("%d,%d",&a,&b);
    if (a<1||b<1)
        printf("Input number should be positive!\n");
    else
        printf("Greatest Common Divisor of %d and %d is %d\n",a,b,Gcd(a,b));
    return 0;
}


题目:
设计一个函数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;
}

题目:
编程计算下面组合数的值
在这里插入图片描述
程序:

#include <stdio.h>
unsigned long Factorial(unsigned int number);
int main()
{
     int m, k;
     double p;

     do{
          printf("Please input m,k (m>=k>0):");
          scanf("%d, %d", &m, &k);
       } while (m<k || m<0 || k<0);

     p = (double)Factorial(m) / (Factorial(k) * Factorial (m-k));
     printf("p=%.0f\n", p);
     return 0;
}

//函数功能:计算无符号整型数number的阶乘
unsigned long Factorial(unsigned int number)
{
     unsigned long i, result = 1;

     for (i=2; i<=number; i++)
     {
          result *= i;
     }
     return result;
}

求阶乘也可以用递归函数

long Fact(int n)
{
    if (n < 0)      return 0;
    if (n==1 || n==0) return  1 ;
    else return n*Fact(n-1);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值