仅部分答案供参考
1.题目描述
给你若干个字符串,请编程输出每个字符串的子串个数。
输入
若干个字符串,每个字符串占一行,字符串中不含空格,长度最大为1000。
输出
对应每一行的字符串,输出该字符串子串的个数代码如下
#include <iostream> #include <string> using namespace std; int main() { string s; while (getline(cin, s)) { // 读入一行字符串 int n = s.size(), ans = 0; for (int i = 0; i < n; i++) { // 枚举起点 for (int j = i + 1; j <= n; j++) { // 枚举终点 ans++; // 子串个数加1 } } cout << ans+1 << endl; // 输出子串个数 } return 0; }
2.题目描述
字符串的索引
输入
第一行:一段字符串
第二行:需索引的字符串
输出:
输入第二行字符串的索引位置(题意为从1开始索引)
代码:
#include<iostream> #include<string> using namespace std; int index(string a, string b) { int b_len, a_len; a_len= a.length(); b_len = b.length(); int de = 1; int ss=0; for (int i = 0; i < a_len; i++) { for (int j = 0; j < b_len; j++) { if (a[i + j] != b[0 + j]) { de = 0; break; } } if (de == 1) { ss = i; break; } if (i == a_len || de == 0) { ss = -1; } de = 1; } return ss; } int main() { string a, b; cin >> a >> b; int x=index(a, b); cout << x+1; }
3.题目描述
求一方阵的对角线上的数之和
输入
方阵的阶数及每行的数值
输出
角线上的数之和
代码:
#include<iostream> #include<string> using namespace std; int create(int N) { int sum1=0; int a; for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { if (j == i) { cin >> a; sum1 = sum1 + a; } else { cin >> a; } } } return sum1; } int main() { int N; cin >> N; cout<<create(N); }
4.题目描述
题目描述
给你一个N行N列的方格矩阵,从外圈按顺时针依次填写自然数,这会构成一个螺旋阵,你能编程实现吗?
比如5行5列的情况如下:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
输入
输入一个正整数数N(N<100)。
输出
输出符合题意的螺旋阵。代码:
#include<iostream> using namespace std; void fun(int n) { int** p = new int* [n]; int j = 0; int k = 0; int m = floor((n + 1) / 2); for (int i = 0; i < n; i++) { p[i] = new int[n]; } int v = 0; for (int i = 1; i <= n*n; i++) { if ( j ==v && k<n-v-1) { p[j][k] = i; k++; continue; } if (k==n-v-1 && j<n-v-1 ) { p[j][k] = i; j++; continue; } if (j == n - v-1 && k > v) { p[j][k] = i; k--; continue; } if ( k == v && j>v) { p[j][k] = i; if (j != v+1) { j--; continue; } if (j == v + 1 && k == v) { v++; k = k + 1; continue; } } if (i == n * n && n % 2 == 1) { p[j][k] = i; } } for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { if (j == n-1) { cout << p[i][j]<<" "; cout << "\n"; } else { cout << p[i][j]<<" "; } } } } int main() { int n; cin >> n; fun(n); }
5. 题目描述
有三根标为A,B,C的柱子,A柱子上从上到下按金字塔状依次叠放着n个半径从1厘米到n厘米的的圆盘,要把A上的所有盘子移动到柱子C上,中间可以临时放在B上,但每次移动每一根柱子上都不能出现大盘子在小盘子上方的情况,要求用最少的移动次数完成,请编程模拟每次移动。
输入
占一行,为整数n(n<64),表示盘子数。
输出
把A上的所有盘子移动到柱子C上,每次只能移动一个盘子,输出移动每一次过程。每次移动占一行,第一个数表示第几步移动,第二个数是移动的盘子的半径,然后是从哪个柱子移动到哪个柱子。
样例输入 复制
2
样例输出 复制
1 1 A->B
2 2 A->C
3 1 B->C代码:
#include <iostream> using namespace std; void move(int n,char A,char B,char C); int step; int main() { int n; cin>>n; move(n,'A','B','C'); return 0; } void move(int n,char A,char B,char C) { if(n==1) { step++; cout<<step<<" "<<n<<" "<<A<<"->"<<C<<endl; } else { move(n-1,A,C,B); step++; cout<<step<<" "<<n<<" "<<A<<"->"<<C<<endl; move(n-1,B,A,C); } }