12.3赛
作者:互联网
\(12\)月\(3\)号算协小组赛
前言
本次比赛由杨锋同学出题,伍树明同学验题。
每题题解
1.
定义一个数从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;
}
2.
仔细观察注意到矩阵对角线上都是\(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;
}
3.
双指针题型。找到每段小串后输出小串的第一个字符。
#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;
}
标签:main,int,tt,namespace,12.3,++,include 来源: https://www.cnblogs.com/wushuming/p/15640473.html