最大公约数和最小公倍数

第2章

基本要求:从键盘输入两个整数,输出两个整数的最大公约数。用C或C++语言实现程序解决问题。

          1.程序风格良好(使用自定义注释模板)

          2.使用三种算法解决问题

          3.提供友好的输入输出,并进行输入数据的正确性验证。

提高要求:完成ACM题目如下:

LowestCommon Multiple Plus

Time Limit: 2000/1000 MS(Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
求n个数的最小公倍数。

Input

输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数。



完成部分要求


源程序

#include <stdio.h>

int panding1();
int panding2();
int panding3();






int fun1(int a,int b)   //辗转相除法求两个数的最大公约数
{
int t;
while(b)
{
t = a%b;
a = b;
b = t;
}
return a;
}


int fun2(int a,int b)    //辗转相减法求两个数的最大公约数  
{
  while(a!=b) 
  {
  if(a>b) 
  a=a-b;    
  else 
  b=b-a;
  }
  return a;
}


int fun3(int a,int b)    //穷举法求两个数的最大公约数
{
int i,t;
for(i=1;i<=a;i++)  
{
if(a%i==0&&b%i==0)  
t=i;
}
return t;
}


int fun4(int a,int b,int c)    //求最小公倍数通解
{
int x;
x=a*b/c;
return x;
}


int main()     //主函数界面设计,调用函数实现计算
{

printf("*********欢迎使用本程序*********\n");
printf("**功能:求n个数的最大公约数和最小公倍数\n");
printf("**方法:A.辗转相除法  B.辗转相减法  C.穷举法\n");
char k;
printf("请选择方法,输入相关代号(A or B or C),输入其他字符结束:\t");
scanf("%c",&k);
printf("\n");
switch(k)
{
case'A': panding1();break;    //用辗转相除法
case'B': panding2();break;    //用辗转相减法
case'C': panding3();break;    //用穷举法
default: printf("输入代号错误。\n");
}
return 0;
}


int panding1()        //辗转相除法求n个数的最大公约数和最小公倍数
{
int x;
int n;
int zdgy;     //最大公约数
int zxgb;     //最小公倍数
int a[1000];
do
{
printf("请输入数得总数:");
scanf("%d",&n);    //输入数的总数n
if(n<2)
{
printf("最大公约数为自己本身。\t");
printf("最小公倍数为自己本身。\n");
}
else
{
int l;
int num=1;
printf("请输入数:");
for(l=0;l<n;l++)   //输入n个数
{
scanf("%d",&a[l]);
num=num*a[l];
}

zdgy=fun1(a[0],a[1]);
zxgb=fun4(a[0],a[1],zdgy);      



for(l=2;l<n;l++)
{

zdgy=fun1(zdgy,a[l]);          //利用fun1函数来求最大公约数
zxgb=fun4(zxgb,a[l],fun1(zxgb,a[l]));    //利用fun4函数来求最小公倍数
}

printf("最大公约数为:");
printf("%d\n",zdgy);
printf("最小公倍数为:");
printf("%d\n",zxgb);
}
printf("继续请输1,结束请输0(结束运算):");
scanf("\t%d",&x);
printf("\n");
}while(x);


return 0;
}


int panding2()        //辗转相减法求n个数的最大公约数和最小公倍数
{
int x;
int n;
int zdgy;     //最大公约数
int zxgb;     //最小公倍数
int a[1000];
do
{
printf("请输入数得总数:");
scanf("%d",&n);    //输入数的总数n
if(n<2)
{
printf("最大公约数为自己本身。\t");
printf("最小公倍数为自己本身。\n");
}
else
{
int l;
int num=1;
printf("请输入数:");
for(l=0;l<n;l++)   //输入n个数
{
scanf("%d",&a[l]);
num=num*a[l];
}

zdgy=fun2(a[0],a[1]);
zxgb=fun4(a[0],a[1],zdgy);
for(l=2;l<n;l++)
{
zdgy=fun2(zdgy,a[l]);         //利用fun1函数来求最大公约数
zxgb=fun4(zxgb,a[l],fun2(zxgb,a[l]));         //利用fun4函数来求最小公倍数
}
printf("最大公约数为:");
printf("%d\n",zdgy);
printf("最小公倍数为:");
printf("%d\n",zxgb);
}
printf("继续请输1,结束请输0(结束运算):");
scanf("\t%d",&x);
printf("\n");
}while(x);
return 0;
}


int panding3()          //穷举法求n个数的最大公约数和最小公倍数
{
int x;
int n;
int zdgy;     //最大公约数
int zxgb;     //最小公倍数
int a[1000];
do
{
printf("请输入数得总数:");
scanf("%d",&n);    //输入数的总数n
if(n<2)
{
printf("最大公约数为自己本身。\t");
printf("最小公倍数为自己本身。\n");
}
else
{
int l;
int num=1;
printf("请输入数:");
for(l=0;l<n;l++)   //输入n个数
{
scanf("%d",&a[l]);
num=num*a[l];
}
zdgy=fun3(a[0],a[1]);
zxgb=fun4(a[0],a[1],zdgy);
for(l=2;l<n;l++)
{
zdgy=fun3(zdgy,a[l]);         //利用fun1函数来求最大公约数
zxgb=fun4(zxgb,a[l],fun3(zxgb,a[l]));         //利用fun4函数来求最小公倍数
}
printf("最大公约数为:");
printf("%d\n",zdgy);
printf("最小公倍数为:");
printf("%d\n",zxgb);
}
printf("继续请输1,结束请输0(结束运算):");
scanf("\t%d",&x);
printf("\n");
}while(x);


return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值