南京理工大学 程序设计基础(Ⅰ) SPOC | 学校专有课程 编程作业 第5章作业1
**第一题:最大公约数和最小公倍数(100分) **
80分案例,因为我不知道怎么取不超过int的数据
题目内容:
设计一个程序,输入两个正整数,分别计算并输出这两个整数的最大公约数和最小公倍数。 要求:编写函数int gcd(int a, int
b)将参数a和b的最大公约数返回;编写函数long long lcm(int a, int
b)将参数a和b的最小公倍数返回。最大公约数请使用辗转相除法来计算,且这两个函数之间可以相互调用。在main中通过调用gcd和lcm函数实现程序的功能。
辗转相除法:对于正整数x和y,x除以y,余数为r;若r不为0,则将y作为新的x,将r作为新的y,重复以上步骤;若r为0,则最大公约数为y。
输入格式:
依次输入2个整数a和b,不超过int型取值范围
输出格式:
若a和b均为正数,则依次输出a和b的最大公约数和最小公倍数,之间用一个空格分隔;否则输出“Error”。
输入样例1:
8 12
输出样例1:
4 24
输入样例2:
25 0
输出样例1:
Error
代码:
#include<iostream>
using namespace std;
int gcd(int a, int b) {
while (true) {
if (a % b == 0) break;
int temp = a;
a = b;
b = temp % b;
}
return b;
}
long long lcm(int a, int b) {
return a * b / gcd(a, b);
}
int main() {
int a, b;
cin >> a >> b;
if (a <= 0 || b <= 0) {
cout << "Error";
system("pause");
return 0;
}
cout << gcd(a, b) << " " << lcm(a, b) << endl;
system("pause");
return 0;
}
第二题:分解质因数(100分)
题目内容:
设计一个程序,对于输入的一个正整数x,分解质因数(素数因子)并按从小到大次序输出所有质因数。例如,12=223, 13=13, 14 =
2*7。要求:编写函数void FacPrimely(int n),用递归的方式将自然数n分解为多个素数的乘积。
提示:如果已经找到n的质因数k,则递归求解n/k的质因数就可以了。
输入格式:
输入一个正整数x,x在int的取值范围内
输出格式:
输出x=,再从小到大依次输出x的所有质因数,之间用*连接
输入样例:
12
输出样例:
12=223
80分案例:(求大佬给一个更优解~)
#include<iostream>
using namespace std;
void FacPrimely(int div, int n);
int main() {
int n;
cin >> n;
cout << n << "=";
FacPrimely(2, n);
system("pause");
return 0;
}
void FacPrimely(int div, int n) {
if (n == div) {
cout << div;
return ;
}
if (n % div == 0) {
cout << div << "*";
FacPrimely(div, n / div);
}
else FacPrimely(div + 1, n);
}
第三题:哥德巴赫猜想(100分)
题目内容:
编程将任意一个大正偶数都能分解为两个素数之和,例如,6=3+3、8=3+5。
要求:编写函数bool IsPrime(int
n)判断n是否为素数,若是返回true,否则返回false。在main中通过调用IsPrime函数实现程序功能:输入整数n,若n不是大于2的正偶数,则报错;否则,输出分解的结果。
输入格式:
输入一个正整数n,n在整型取值范围内
输出格式:
若n不是大于2的正偶数,则输出“It’s not an even larger than 2!”;否则,输出所有分解结果,格式为n=后从小到大输出分解后的两个素数,并用+连接。
输入样例1:
50
输出样例1:
50=3+47
50=7+43
50=13+37
50=19+31
输入样例2:
5
输出样例2:
It’s not an even larger than 2!
#include<iostream>
using namespace std;
bool isPrime(int n) {
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
int main() {
int n;
cin >> n;
if (n <= 2 || n % 2 != 0) {
cout << "It's not an even larger than 2!";
return 0;
}
for (int i = 2; i < n; i++) {
if (isPrime(i)) {
if (isPrime(n - i)) {
if (i < n - i) cout << n << "=" << i << "+" << n - i << endl;
}
}
}
return 0;
}
本文提供南京理工大学程序设计基础课程的三道编程作业解答示例,包括最大公约数和最小公倍数计算、质因数分解及哥德巴赫猜想验证。代码采用C++语言实现。
1517





