C语言习题练习:分解质因数+划分学习成绩+计算最大公约数和最小公倍数

题目一:分解质因数

将一个正整数分解质因数。例如:输入90,输出90的质因数为:2 3 3 5

思路

程序分析:对N进行分解质因数,应该先找到一个最小的质数k,存在以下几种情况:
1.如果这个质数恰等于n,则说明分解质因数的过程已经结束,输出即可
2.如果能被k整除则应先输出k的值,并用n除以k的商作为新的正整数你,重复智商上述步骤
3.如果n不能被k整除,则应该把k+1作为k的值,重复执行第一步
转换成C语言如下

if (n == 1)//考虑输入的正整数为1
	{
		printf("1的质因数为:1");
	}
	else
	{
		printf("%d的质因数为:",n);
		for (k = 2; k <= n; k++)
		{
			while (n % k == 0)
			{
				printf("%d  ", k);
				n = n / k;
			}
		}
	}

完整程序如下

#include <stdio.h>
int main()
{
	int n;
	int k;
	printf("请输入要分解的正整数: ");
		scanf("%d", &n);
	if (n == 1)
	{
		printf("1的质因数为:1");
	}
	else
	{
		printf("%d的质因数为:",n);
		for (k = 2; k <= n; k++)
		{
			while (n % k == 0)
			{
				printf("%d  ", k);
				n = n / k;
			}
		}
	}
	return 0;
}

结果
在这里插入图片描述
在这里插入图片描述

题目二:划分学习成绩

利用条件运算符的嵌套完成:学习成绩>=90分的同学用A表示,60-89分的用B表示,60分以下的用C表示

思路

条件运算符:

(a>b)?a:b

存在两个变量,一个是分数,一个是等级,先进行定义

int score;
int grade;

条件运算符表达式为:

grade = (score >= 90) ? 'A' : ((score >= 60) ? 'B' : 'C');

整个程序如下:

#include <stdio.h>
int main()
{
	int score;
	char grade;
	printf("请输入学生分数: ");
	scanf("%d", &score);
	grade = (score >= 90) ? 'A' : ((score >= 60) ? 'B' : 'C');
	printf("学生等级为: %c\n", grade);
	return 0;
}

结果
在这里插入图片描述
在这里插入图片描述

题目三:输入两个正整数m和n,求其最大公约数和最小公倍数

思路

1.最小公倍数=两个数的积÷最大公约数
2.求最大公约数用捻转相除法(又名欧几里得算法)

假如求1997和615两个正整数的最大公约数,用欧几里得算法:
1997/65=3余152
615/152=4余7
152/7=21余5
7/5=1余2
5/2=2余1
2/1=2余0
则最大公约数为1
用除数和余数反复做运算,挡余数为0时,取当前算式除数为最大公约数,所以就得出了1997和615的最大公约数为1

通过上面的分析,我们知道计算最大公约数存在4个变量,分别为正整数a,正整数b,最小公倍数c,余数d

int a;
int b;
int c;
int d;

将欧几里得算法转化成C

if (a < b)
	{
		temp = a;
		a = b;
		b = temp;
	}
	
		d = a % b;
		while (d != 0)
		{
			a = b;
			b = d;
			d = a % b;
		}
		printf("%d\n", b);

整个程序如下

#include <stdio.h>
int main()
{
	int a;//第一个正整数
	int b;//第二个正整数
	int c;//最小公倍数
	int d;//余数
	int temp;
	int e;//求最小公倍数用,因为求最大公约数时ab数值会产生变化
	int f;//求最小公倍数用,因为求最大公约数时ab数值会产生变化
	printf("请输入两个正整数:\n");
	printf("第一个正整数: ");
	scanf("%d", &a);
	printf("第二个正整数: ");
	scanf("%d", &b);
	printf("%d和%d的最大公约数是: ", a, b);
	e = a;//求最小公倍数用
	f = b;//求最小公倍数用
	if (a < b)
	{
		temp = a;
		a = b;
		b = temp;
	}
	
		d = a % b;
		while (d != 0)
		{
			a = b;
			b = d;
			d = a % b;
		}
		printf("%d\n", b);
	c = e * f / b;//计算最小公倍数
	printf("%d和%d的最小公倍数是: %d", e, f, c);
	return 0;
}

结果
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello xiǎo lěi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值