本次比赛由杨锋同学出题,伍树明同学验题。
定义一个数从1开始计数,在for循环中如果s可以被k整除就输出ABC,否则输出s,每一次循环s都要加1。输出时注意空格和换行。
#include <iostream> #include <cstring> #include <algorithm> using namespace std; int main() { int n, k, s = 1; cin >> n >> k; for(int i = 1; i <= n ; i ++) { for(int j = 1; j <= n; j ++) { if(s % k == 0) { cout << "ABC" << " "; } else { cout << s << " "; } s ++; } cout << endl; } return 0; }
仔细观察注意到矩阵对角线上都是\(1\),每行从对角线位置起依次加一,每列从对角线位置起依次加一。于是很容易想到模拟
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 105; int a[N][N]; int b[N]; int n; int main() { for(int i = 0; i < N; ++ i) b[i] = i + 1; cin >> n; while(n) { memset (a, 0, sizeof a); for(int i = 0; i < n; ++ i) { int j = i; int tt = 0; for(int k = i; k < n; ++ k) a[i][k] = ++tt; //行 tt = 0; for(int k = i; k < n; ++ k) a[k][j] = ++ tt; //列 } //输出 for(int i = 0; i < n; ++ i) { for(int j = 0; j < n; ++ j) { cout << a[i][j] << ' '; } puts(""); } cout << endl; cin >> n; } return 0; }
如果你观察仔细的话还能发现以下规律
#include <iostream> #include <algorithm> using namespace std; int n; int main() { while (cin >> n) { for (int i = 0; i < n; i ++ ) { for (int j = 0; j < n; j ++ ) cout << abs(i - j) + 1 << ' '; // 规律 cout << endl; } if (n) cout << endl; } return 0; }
双指针题型。找到每段小串后输出小串的第一个字符。
#include <iostream> #include <cstring> #include <algorithm> using namespace std; int main() { int n; scanf("%d\n",&n); string s, g; getline(cin,s); //双指针 for(int i = 0; i < s.size(); i ++) { int j = i; g += s[i]; while(s[j] == s[i]) j ++; i = j - 1; } cout << g; return 0; }