2023矿大数据结构实验一C++
目录:
1.题目A
2.题目B
3.题目C
4.题目D
5.题目E
6.题目F
代码仅供参考!!!
题目A
题目描述
新年快到了,天勤准备搞一个聚会,已经知道现有会员N人,把会员从1到N编号,其中会长的号码是N号,凡是和会长是老朋友的,那么该会员的号码肯定和N有大于1的公约数,否则都是新朋友,现在会长想知道究竟有几个新朋友?请你编程序帮会长计算出来。
输入
第一行是测试数据的组数CN(Case number,1<CN<10000),接着有CN行正整数N(1<n<32768),表示会员人数。
输出
对于每一个N,输出一行新朋友的人数,这样共有CN行输出。
代码如下:
#include<iostream> using namespace std; int people(int n) { int i, j, k = 1; int m = n; for (i = 2; i <= m; i++) { if (m % i == 0) { k *= (i - 1); while (m % i == 0) { m /= i; k *= i; } k /= i; } } return k; } int main() { int m, n, i; cin >> n; i = n; int* p = new int[n]; while ((n--) != 0) { cin >> m; *p = people(m); p++; } p = p - i; while ((i--) != 0) { cout << *p << endl; p++; } return 0; }
运行结果:
题目B
题目描述
给你一个正整数n,请问有多少个比n小的且与n互质的正整数?
两个整数互质的意思是,这两个整数没有比1大的公约数。输入
输入包含多组测试数据。每组输入是一个正整数n(n<=1000000000)。当n=0时,输入结束。
输出
对于每组输入,输出比n小的且与n互质的正整数个数。
代码如下:
#include<iostream> #include<cmath> using namespace std; int main() { int N, n, i; int* p=new int[10]; i = 0; while (scanf_s("%d", &N) != EOF) { i++; if (N == 0) break; n = N; for (int i = 2; i <= sqrt(N); i++) if (N % i == 0) { n = n / i * (i - 1); while (N % i == 0) N /= i; } if (N > 1) { n = n / N * (N - 1); *p = n; p++; } } p = p - i + 1; for (int j = 0; j < i - 1; j++) { cout << *p<<endl; p++; } return 0; }
运行结果:
题目C
题目描述
n个人围成一圈,按1到n的顺序编号。从第一个人开始报数(从1到m报数),凡报到m的人退出圈子,问最后留下的是原来的第几号。
输入
首先输入两个正整数n和m,n表示n个人围一个圈子(n>=2),m表示从1报数到m的人退出圈子(1=<m)。
输出
最后剩下的人的编号。
代码如下:
#include <iostream> using namespace std; int main() { int n, m; cin >> n >> m; int *a=new int[n]; for (int i = 0; i < n; i++) { *(a+i) = i + 1; } int p = 0; while (true) { int count = 0; while (count < m) { if (*(a + p) != 0) { count++; } if (count == m) { break; } p++; if (p == n) { p = 0; } } *(a + p) = 0; int remain = 0; for (int i = 0; i < n; i++) { if (*(a + i) != 0) { remain++; } } if (remain == 1) { break; } p++; if (p == n) { p = 0; } } for (int i = 0; i < n; i++) { if (*(a + i) != 0) { cout << *(a + i) << endl; break; } } return 0; }
运行结果:
题目D
题目描述
编写程序演示把一个10进制整数转换为R进制的转换结果。
输入
正整数N和R,空格分隔
N是输入的十进制数,R需要转换的进制数,2<=R<=20输出
将10进制整数转换为R进制的转换结果,超过9的数字符号显示为A、B、C……Z等字母。
代码如下:
#include <iostream> using namespace std; int main() { int n, r; cin >> n >> r; char a[36]; int i = 0; while (n >= r) { int remainder = n % r; if (remainder >= 10) { a[i] = 'A' + remainder - 10; } else { a[i] = '0' + remainder; } i++; n /= r; } if (n >= 10) { a[i] = 'A' + n - 10; } else { a[i] = '0' + n; } for (int j = i; j >= 0; j--) { cout << a[j]; } cout << endl; return 0; }
运行结果:
题目E
题目描述
输入两个整数的求和式,比如1+2=,输出求和式和对应结果。请编程实现。
输入
一个求和式,形如a+b=。
输出
求和式及对应结果。
代码如下:
#include <iostream> #include <sstream> using namespace std; int main() { string input; cin >> input; int a, b, sum; char op; stringstream ss(input); ss >> a >> op >> b; sum = a + b; cout << input << sum << endl; return 0; }
运行结果:
题目F
题目描述
波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的波兰表示法为+ 2 3。波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的波兰表示法为* + 2 3 4。本题求解波兰表达式的值,其中运算符包括+ - * /四个。
输入
输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。
输出
输出为一行,表达式的值(保留6位小数)。
代码如下:
#include <iostream> #include <algorithm> using namespace std; double solve(); int main() { double c; c=solve(); printf("%.6f", c); return 0; } double solve() { char a[10]; cin >> a; switch (a[0]) { case '+':return solve() + solve(); case '-':return solve() - solve(); case '*':return solve() * solve(); case '/':return solve() / solve(); default:return atof(a); } }
运行结果:
题目G
题目描述
上体育课的时候,老师已经把班级同学排成了两个队列,而且每个队列都是按照从底到高排好队,现在需要把两个队列合并,合并后需要保证还是从低到高排列。合并队列,你能编程实现吗?
输入
第1行为n,表示开始排成的每个队列的长度。第2、3行是代表从小到大的n个整数,每行的整数间有一个空格间隔。
输出
输出占一行,为从小到大的整数,每个整数间间隔一个空格。
代码如下:
#include <iostream> #include <vector> using namespace std; vector<int> merge(vector<int>& v1, vector<int>& v2) { vector<int> res; int i = 0, j = 0; while (i < v1.size() && j < v2.size()) { if (v1[i] < v2[j]) { res.push_back(v1[i]); i++; } else { res.push_back(v2[j]); j++; } } while (i < v1.size()) { res.push_back(v1[i]); i++; } while (j < v2.size()) { res.push_back(v2[j]); j++; } return res; } int main() { int n; cin >> n; vector<int> v1(n), v2(n); for (int i = 0; i < n; i++) { cin >> v1[i]; } for (int i = 0; i < n; i++) { cin >> v2[i]; } vector<int> res = merge(v1, v2); for (int i = 0; i < res.size(); i++) { cout << res[i] << " "; } cout << endl; return 0; }
运行结果: