前言
今天怎么就5月4日了!!!!
第十六题
题目:
输入两个正整数m和n,求其最大公约数和最小公倍数。
碎碎念:
自从回想起函数后,我觉得万物皆可用函数,这题用函数也简单。
我的思路:
2、输入:正整数m、n
输出:这两数的最大公约数和最小倍数。
3、分析:
最小公倍数=输入的两个数之积除于它们的最大公约数,关键是求出最大公约数
求最大公约数用辗转相除法(又名欧几里德算法,我翻书看的)
第一步:a /b,令r为所得余数(0≤r )
第二步:互换:置 a←b,b←r,并返回第一步。
我的过程:
方法一:
#include<stdio.h>
int main()
{
int a,b,t,r,n;
printf("请输入两个数字:\n");
scanf("%d %d",&a,&b);
if(a<b)
{t=b;b=a;a=t;}
r=a%b;
n=a*b;
while(r!=0)
{
a=b;
b=r;
r=a%b;
}
printf("这两个数的最大公约数是%d,最小公倍数是%d\n",b,n/b);
return 0;
}
方法二:用函数
#include<stdio.h>
void f14(int m,int n){
int i=0;
int num=1;
int temp1=m,temp2=n;//用两个变量寄存m,n的值
int min=m<n?m:n;//求得m,n中的较小值
for(i=2;i<=min;i++){
if((m%i==0)&&(n%i==0)){
//printf("%d\n",i);
num*=i;
m=m/i;
n=n/i;
min=min/i;
i=1;//i的还原,不然在执行一次循环体后,i++=3,下次循环时,会将i=2这个商给跳过,出现问题
//printf("%d\n",min);
}
}
printf("最大公约数为:%d\n",num);
printf("最小公倍数为:%d\n",temp1*temp2/num);
}
int main(){
printf("请输入两个数:");
int m,n;
scanf(" %d %d",&m,&n);
f14(m,n);
return 0;
}
方法三:辗转相除法(我看懂了)
#include<stdio.h>
#include<math.h>
int main()
{
int a,b,n,t,j;
printf("输入2个正整数:");
scanf("%d%d",&a,&b);
if(a<b)
{
t=a;
a=b;
b=t;
}
n=a%b;
j=a*b;
while(n!=0)
{
a=b;
b=n;
n=a%b;
}
printf("%d是最大公约数\n",b);
printf("%d是最小公倍数\n",j/b);
}
运行结果:
总结
感觉越来越上手了。方法也从最开始的一种能写出第二种了