题目一:分解质因数
将一个正整数分解质因数。例如:输入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;
}
结果