C程序设计 上机作业251201

cout<<"hello"<<endl; 发布于 9 天前 56 次阅读 预计阅读时间: 15 分钟


第一题

【问题描述】

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)求余弦函数的近似值。

image-20251201170104009

【输入形式】

输入两个浮点数:精度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;
}