第一题
【问题描述】
2500年前数学大师毕达哥拉斯就发现,正整数数对220和284之间存在着奇妙的联系: 220的因数之和(除了自身之外的因数)为1+2+4+5+10+11+20+22+44+55+110=284,而284的因数之和则为1+2+4+71+142=220。毕达哥拉斯把这样的数对称为相亲数(注意:构成相亲数的两个数不等。一个为雄数,另一个称为雌数)。编程求M和N(M、N为大于1并且在unsigned表示范围内)之间的所有相亲数。M、N由用户从键盘上输入。
【输入形式】
用户输入两个正整数保存到M和N中,以一个空格分隔,如:
100 300
【输出形式】
程序找出M到N间的各相亲数并输出。各相亲数的输出格式:先输出该相亲数是M到N间的第几个相亲数,再输出该相亲数中的雌、雄数及其因子计算式。雌雄数输出时分别各占一行,输出时先输出雌雄数的值,再输出英文冒号“:”,再从1开始输出各因数相加的公式,最后输出英文等号“=”和所有因数之和。注意:所有输出因素间无空格。各相亲数间空一行间隔输出。
【样例输入】
100 300
【样例输出】
1
220:1+2+4+5+10+11+20+22+44+55+110=284
284:1+2+4+71+142=220
【样例说明】
样例中1表示100~300间第1对相亲数。220和284是构成这对相亲数中的雌雄数,注意它们的输出格式。
#include <iostream>
using namespace std;
int execute1(int a, int &sum1) {
sum1 = 1;
for (int i = 2; i < a; i++) {
if (a % i == 0) {
sum1 += i;
}
}
return 0;
}
int execute1_r(int a, int &sum1) {
sum1 = 1;
cout << a << ":1";
for (int i = 2; i < a; i++) {
if (a % i == 0) {
cout << "+" << i;
sum1 += i;
}
}
cout << "=" << sum1 << endl;
return 0;
}
int main() {
int M, N;
cin >> M >> N;
int count = 0;
for (int i = M; i <= N; i++) {
int sum1 = 0;
execute1(i, sum1);
if (sum1 <= i || sum1 > N) continue;
int sum2 = 0;
execute1(sum1, sum2);
if (sum2 == i) {
count++;
if (count > 1) cout << endl;
cout << count << endl;
execute1_r(i, sum1);
execute1_r(sum1, sum2);
}
}
return 0;
}
第二题
【问题描述】
编写函数int prime_m( int n,int x[], long y[]),在2~n范围内查找同时符合以下条件的整数m:2m -1是素数、2m -1的反序数是奇数、2m -1的十进制表示中包含数字1。将2~n范围内符合上述条件的所有整数m依次保存到x指向的数组中,将与m对应的整数2m -1依次保存到y指向的数组中。函数返回x数组中保存的整数个数。
【输入形式】
测试数据:n=20
【输出形式】
输出结果:
5 31
7 127
17 131071
#include <iostream>
#include <cmath>
using namespace std;
bool isP(long n) {
if (n <= 1) return false;
if (n == 2) return true;
if (n % 2 == 0) return false;
for (long i = 3; i <= sqrt(n); i += 2)
if (n % i == 0) return false;
return true;
}
long rev(long n) {
long r = 0;
while (n > 0) {
r = r * 10 + n % 10;
n /= 10;
}
return r;
}
bool has1(long n) {
while (n > 0) {
if (n % 10 == 1) return true;
n /= 10;
}
return false;
}
int prime_m(int n, int x[], long y[]) {
int c = 0;
for (int m = 2; m <= n; m++) {
long num = static_cast<long>(pow(2, m)) - 1;
if (!isP(num)) continue;
if (rev(num) % 2 == 0) continue;
if (!has1(num)) continue;
x[c] = m;
y[c] = num;
c++;
}
return c;
}
int main() {
int x[100];
long y[100];
int n = 20;
int cnt = prime_m(n, x, y);
for (int i = 0; i < cnt; i++)
cout << x[i] << "\t" << y[i] << endl;
return 0;
}
第三题
【问题描述】
输入一个正整数n,生成一张阶乘表,输出1! ~n! 的值。要求定义和调用函数fact(n)计算n!,函数类型为double。
【输入形式】
从键盘输入一个正整数n。
【输入输出样例1】(下划线部分表示输入)
Enter n: 3
1!=1
2!=2
3!=6
【样例说明】
输入提示符后要加一个空格。其中:后要加一个且只能一个空格。
输出语句的=两边无空格。
英文字母区分大小写。必须严格按样例输入输出。
#include <iostream>
using namespace std;
double fact(int n) {
double result = 1;
for (int i = 1; i <= n; i++) {
result *= i;
}
return result;
}
int main() {
int n;
cout << "Enter n: ";
cin >> n;
for (int i = 1; i <= n; i++) {
cout << i << "!=" << fact(i) << endl;
}
return 0;
}
第四题
【问题描述】
验证哥德巴赫猜想:任何一个大于6的偶数均可表示为两个素数之和。例如,6=3+3,8=3+5,......,18=5+13。要求将6~100之间的偶数都表示为两个素数之和,输出时一行输出五组。
【输入形式】
无输入
【输出形式】
按从小到大、每组五行
每组的格式为:四位=2位+2位。
等号和加号两侧无空格。
#include <iostream>
#include <iomanip>
using namespace std;
bool isPrime(int num) {
if (num <= 1) return false;
if (num == 2) return true;
if (num % 2 == 0) return false;
for (int i = 3; i * i <= num; i += 2) {
if (num % i == 0) return false;
}
return true;
}
void goldbach() {
int count = 0;
for (int even = 6; even <= 100; even += 2) {
for (int p1 = 2; p1 <= even / 2; p1++) {
int p2 = even - p1;
if (isPrime(p1) && isPrime(p2)) {
cout << setw(4) << even << "=" << setw(2) << p1 << "+" << setw(2) << p2 << " ";
count++;
if (count % 5 == 0) cout << endl;
break;
}
}
}
}
int main() {
goldbach();
return 0;
}
第五题
【问题描述】
输入精度e 和实数x,用下列公式求cos x 的近似值,精确到最后一项的绝对值小于e。要求定义和调用函数funcos(e,x)求余弦函数的近似值。

【输入形式】
输入两个浮点数:精度e和实数x
【输入输出样例1】(下划线部分表示输入)
e: 0.001
x: 1
cos(x)=0.540
【样例说明】
输入提示符后要加一个空格。例如e: ;,其中:后要加一个且只能一个空格。
输出语句的=两边无空格
计算结果保留3位小数
英文字母区分大小写。必须严格按样例输入输出。
第六题
【问题描述】
同构数是其平方数的尾数等于该数自身的自然数,例如:25*25=625。从键盘输入一个不大于10000的自然数,判断其是否是同构数并按样例格式输出。
【输入形式】
从键盘输入一个不大于10000的自然数。
【输出形式】
输出格式按样例。
【样例输入1】
25
【样例输出1】
25 yes,25*25=625
【样例输入2】
11
【样例输出2】
11 no,11*11=121
【评分标准】
#include <iostream>
using namespace std;
bool isAutomorphic(int num) {
long square = num * num;
while (num > 0) {
if (num % 10 != square % 10) {
return false;
}
num /= 10;
square /= 10;
}
return true;
}
int main() {
int num;
cin >> num;
if (isAutomorphic(num)) {
cout << num << " yes," << num << "*" << num << "=" << num * num << endl;
} else {
cout << num << " no," << num << "*" << num << "=" << num * num << endl;
}
return 0;
}
第七题
【问题描述】
绝对素数是指本身是素数,其逆序数也是素数的数。例如:10321与12301是绝对素数。
编写一个程序,求出所有m~n(m≥11,n≤1000000)之间的绝对素数
【输入形式】两个整数m和n。
【输出形式】m~n之间的绝对素数,每个数之间用空格隔开,每行输出10个
【样例输入】
11 300
【样例输出】
11 13 17 31 37 71 73 79 97 101
107 113 131 149 151 157 167 179 181 191
199
【样例说明】 【评分标准】
#include <iostream>
#include <cmath>
using namespace std;
bool isPrime(int num) {
if (num <= 1) return false;
if (num == 2) return true;
if (num % 2 == 0) return false;
for (int i = 3; i * i <= num; i += 2) {
if (num % i == 0) return false;
}
return true;
}
int reverseNumber(int num) {
int reversed = 0;
while (num > 0) {
reversed = reversed * 10 + num % 10;
num /= 10;
}
return reversed;
}
void findAbsolutePrimes(int m, int n) {
int count = 0;
for (int num = m; num <= n; num++) {
if (isPrime(num)) {
int reversed = reverseNumber(num);
if (isPrime(reversed)) {
cout << num;
count++;
if (count % 10 == 0) {
cout << endl;
} else {
cout << " ";
}
}
}
}
// 确保最后没有多余的空格或换行
if (count % 10 != 0) {
cout << endl;
}
}
int main() {
int m, n;
cin >> m >> n;
findAbsolutePrimes(m, n);
return 0;
}
第八题
【问题描述】函数重载:数据查找
编写重载函数Finddata,查找整型数组和字符数组中的特定数据,找到函数返回第一个数据的下标,找不到返回-1。设main函数中的部分代码如下,请根据输入、输出格式,完成程序。
int main()
{
int fid, arr[] = {-11,3,5,13,27,8,23,45,2,3,-14,0,43,20,2,30,5,45,0,42,38,67 };
char ch,str[] = "The university seeks to integrate social service into its schooling.";
int N = sizeof(arr) / sizeof(int);
cin>>fid;//fid为要查找的整数
int i = Finddata(arr, N, fid);
…………………………………………………………………………//省略若干条语句
cin>>ch; //ch为要查找的字符
i = Finddata(str, ch);
…………………………………………………………………………//省略若干条语句
return 0;
}
【输入输出形式】
27 (用户输入要查找的整数27)
Found:4 (程序输出查找到的整数27的下标4)
u (用户输入要查找的字符u)
Found:4 (程序输出查找到的字符u的下标4)
【样例输入输出】
20
Found:13
X
Not Found!
【样例说明】
arr及str数组为系统样例测试数据,不得修改。
【评分标准】
#include <iostream>
using namespace std;
int Finddata(int arr[], int size, int target) {
for (int i = 0; i < size; i++) {
if (arr[i] == target) {
return i;
}
}
return -1;
}
int Finddata(char str[], char target) {
for (int i = 0; str[i] != '\0'; i++) {
if (str[i] == target) {
return i;
}
}
return -1;
}
int main() {
int fid, arr[] = {-11,3,5,13,27,8,23,45,2,3,-14,0,43,20,2,30,5,45,0,42,38,67};
char ch, str[] = "The university seeks to integrate social service into its schooling.";
int N = sizeof(arr) / sizeof(int);
cin >> fid;
int i = Finddata(arr, N, fid);
if (i != -1) {
cout << "Found:" << i << endl;
} else {
cout << "Not Found!" << endl;
}
cin >> ch;
i = Finddata(str, ch);
if (i != -1) {
cout << "Found:" << i << endl;
} else {
cout << "Not Found!" << endl;
}
return 0;
}
Comments NOTHING