题目:求两个正整数的最大公约数和最小公倍数。
基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出。
提高要求:1.三种以上算法解决两个正整数最大公约数问题。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
void test01();
void test02();
void test03();
void menu();
void proc()
{
char buf[103];
memset(buf, ' ', sizeof(buf));
buf[0] = '[';
buf[101] = ']';
buf[102] = '\0';
int i = 0;
char index[6] = "-\\|/\0";
while (i <= 100)
{
buf[i] = '=';
printf("%s [%d%%][%c]\r", buf, i, index[i % 4]);
fflush(stdout);//刷新缓冲区
Sleep(200);
i++;
}
printf("\n");
}
int main()
{
proc();
int k;
k = 1;
while (k)
{
menu();
}
return 0;
}
void test01()//辗转相除法
{
int m, n, a, b, c;
printf("使用辗转相除法求算\n");
printf("请输入两个整数:");
scanf("%d%d", &a, &b);
m = a;
n = b;
if (a <= 0 || b <= 0)
{
printf("输入有误,请重新输入:\n\t");
scanf("%d%d", &a, &b);
m = a;
n = b;
}
while (b != 0) //余数不为0,继续相除,直到余数为0
{
c = a%b;
a = b;
b = c;
}
printf("用辗转相除法求得 最大公约数为:%d\n", a);
printf("\n\t\t 最小公倍数为:%d\n", m*n / a);
}
void test02()//穷举法
{
int temp = 0, a, b;
printf("请输入要求最大公约数的两个数:\n");
scanf("%d %d", &a, &b);
if (a<b){ //保证a>b
a = a^b; //用异或法交换a,b的值
b = a^b;
a = a^b;
}
for (temp = b;; temp--){ //用穷举法求最大公约数
if (a%temp == 0 && b%temp == 0)
break;
}
printf("最大公约数为:%d\n", temp);
}
void test03()//辗转相减法
{
int a, b;
printf("请输入要求最大公约数的两个数:\n");
scanf("%d %d", &a, &b);
while (a != b)
{
if (a>b)
{
a = a - b;
}
else
b = b - a;
}
printf("最大公约数为:%d\n", a);
}
void menu() //主界面
{
int num;
printf(" \n\t************************************************** \n");
printf(" * 求两数最大公约数和最小公倍数的三种算法 * ");
printf(" \n\t**************************************************\n\n");
printf(" ---------------------- ---------------------- \n");
printf(" * 1.辗转相除法 \n\n");
printf(" * 2.穷举法 \n\n");
printf(" * 3. 相减法 \n\n");
printf("请选择编号1—3:");
scanf("%d", &num);
switch (num)
{
case 1:test01();
break;
case 2:test02();
break;
case 3:test03();
break;
default:
printf("\n输入错误,请在1—之3间选择\n");
}
}
算法设计思路:
测试截屏