求两个正整数的最大公约数和最小公倍数。

题目:求两个正整数的最大公约数和最小公倍数。

基本要求: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");
	}
}

算法设计思路:

测试截屏

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值