【C语言】求两个整数的最大公约数、最小公倍数

时间:2022-11-11 00:37:19

分析:求最大公约数的算法思想:

1)对于已知两数m,n,使得m>n;

2)m除以n得余数r;

3)若r=0,则n 为求得的最大公约数,算法结束;否则执行(4);

4)m <-n,n<-r,再重复执行(2)

其中,最小公倍数 = 两个整数之积 / 最大公约数

例: 求 m = 14,n=6的最大公约数 和 最小公倍数

m   n   r

14  6   2

 6   2   0

/*
* main.c
*
* Created on: 2012-4-29
* Author: Lee
* Description: 求两个整数的最大公约数和最小公倍数
*/

#include<stdio.h>

int main()
{
int num1,num2 =2;// 两个变量
int product; // num1,num2 的乘积
int remainder; // 余数变量
int temp; //临时变量
printf("------------------------\n");
printf("计算两个整数的最大公约数和最小公倍数\n");
printf("------------------------\n");
printf("Input two numbers:");
fflush(stdout);//Eclipse中scanf()函数先于printf()函数输出到缓冲区,
//用fflush(stdout)强制刷新缓冲区
scanf("%d%d",&num1,&num2);
printf("%d 和 %d 的最大公约数:",num1,num2);
product = num1*num2;
if(num1 < num2)//如果num1比num2小 , 交换其值 ,使num1>num2
{
temp = num2;
num2 = num1;
num1 = temp;
}
remainder = num1%num2; // num1 除以num2 得余数 保存在变量remainder中
while(0 != remainder)//检查余数是否为0 , 为0则num2 为求得的最大公约数,否则执行while程序体
{
num1 = num2; // 将num2 赋值给 num1
num2 = remainder; // 将余数 赋值给 num2
remainder = num1%num2; // 继续取num1 对 num2的余数 直到 余数为0 退出循环
}
printf("%d; ",num2); // num2 记录最大公约数
printf(" 最小公倍数: %d\n",product/num2); //两数乘积与最大公约数的商就是最小公倍数
return 0;
}

 

结果截图:

【C语言】求两个整数的最大公约数、最小公倍数
问题一: 多加了一个 “,” 导致scanf()无法接收第二个参数值

问题描述:scanf("%d , %d ",&num1,num2);在两个“%d”中间习惯性地多加了一个 ","  但是在输入参数时 却习惯性地在参数一和参数二中用空格分开表示这是两个参数结果导致 num2 无法接收到第二个参数值 

解决方案:

方案一:scanf("%d , %d ",&num1,num2);不需更改 ,但是在输入参数时要按 num1, num2 格式输入(即num1和 num2之间必须要有一个","分开 才能表示输入了两个参数,否则认为只输入了一个参数,第二个参数就丢掉了)才有效。

方案二:将scanf("%d , %d ",&num1,num2);去掉 “,”改成scanf("%d%d ",&num1,num2);那么输入格式为 num1 num2  (num1 和 num2 之间可以有一个或多个空格,但不能有 ",")

 备注:scanf()的详细用法,请参考http://blog.csdn.net/zhaoxiatengkong_1/article/details/7523004

问题二:Eclipse下printf和 scanf的运行顺序问题

问题描述:在Eclipse中运行C程序时,发现scanf比printf先执行了,结果printf的提示语句在scanf执行完之后才打印出,导致程序运行开始时,控制台一篇空白,没有printf里面的提示语句。这是因为 scanf比printf先输出到了缓冲区,printf后到, 但是缓冲区没有立即刷新导致 程序运行时没有提示语,显示一篇空白

解决方案:解决方案有两个,第一,设置缓冲区为空, 即没有缓冲区;第二,每执行printf()之后,强制立即刷新缓冲区;方案具体实施如下:

方案一:在printf之前添加:setvbuf(stdout,NULL,_IONBF,0); 达到设置缓冲区为空的目的

方案二:在每句printf()之后添加fflush(stdout); 强制立即刷新缓冲区

测试代码:

方案一:

#include <stdio.h>

int main(void) {
setvbuf(stdout,NULL,_IONBF,0);

char aa[20];
printf ("input:");
scanf("%s", aa);
printf ("output:%s", aa);
return 0;
}


方案二:

#include <stdio.h>

int main(void) {
char aa[20];
printf ("input:");
fflush(stdout);
scanf("%s", aa);
printf ("output:%s", aa);
fflush(stdout);
return 0;
}


备注:问题二解决方案全程参考:http://yutuo.net/archives/7b59add9e0bcd296.html | 宇托的狗窝