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