经典语法题
1. 约瑟夫环问题
题目描述
已知\(n\)个人(以编号\(1,2,3,...,n\)分别表示)围坐在一张圆桌周围,从编号为\(k\)的人开始报数,数到\(m\)的那个人出圈,他的下一个人又从\(1\)开始报数,数到\(m\)的那个人又出圈;按照这个规律一直重复下去,最后一个出局的人为游戏的最终胜利者。
输入格式
\(n\) \(m\) \(k\)
输出格式
输出胜利者的编号
输入样例
11 3 1
输出样例
7
C++代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int n, m, k;
bool st[N];
int main()
{
cin >> n >> m >> k;
int cnt = 0, j = 0; //cnt表示出环的人数,j表示报的数
for (int i = k; ; i = (i + 1) % n) //模拟报数的人的编号
{
if (i == 0) i = n;
while (st[i])
{
i = (i + 1) % n;
if (i == 0) i = n;
}
j ++ ;
if (j % m == 0)
{
cnt ++ ;
st[i] = true;
}
if (cnt == n - 1) break;
}
for (int i = 1; i <= n; i ++ )
if (!st[i])
cout << i << endl;
return 0;
}
2. 说反话-加强版
来源:pta 7-32
题目链接
题目描述
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式
测试输入包含一个测试用例,在一行内给出总长度不超过\(500 000\)的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。
输出格式
每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。
输入样例
Hello World Here I Come
输出样例
Come I Here World Hello
C代码
#include <stdio.h>
#include <string.h>
#define N (500010)
char s[N];
int main()
{
while (gets(s) != NULL)
{
int n = strlen(s);
int k = 0, flag = 0;
for (int i = n - 1, j = n - 1; i >= 0; i --, j -- )
{
while (s[i] == ' ' && i >= 0)
{
i -- ;
j -- ;
}
while (s[j] != ' ' && j >= 0) j -- ;
if (i == -1 &&j == -1) continue; //前面是空格的样例
if (flag) printf(" ");
flag = 1;
for (k = j + 1; k <= i; k ++ )
printf("%c", s[k]);
i = j;
}
}
return 0;
}
3. 数列求和-加强版
来源 pta7-38
原题链接
题目描述
给定某数字\(A(1≤A≤9)\)以及非负整数\(N(0≤N≤100000)\),求数列之和\(S=A+AA+AAA+⋯+AA⋯A(N个A)\)。例如\(A=1, N=3\)时,\(S=1+11+111=123\)。
输入格式
输入数字\(A\)与非负整数\(N\)。
输出格式
输出其\(N\)项数列之和\(S\)的值。
输入样例
1 3
输出样例
123
C代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 100010
int n, x;
int a[N];
int main()
{
scanf("%d%d", &x, &n);
if (n == 0) printf("0");
int k = 0;
for (int i = n, t = 0; i >= 1 || t; i -- )
{
t += i * x;
a[k ++ ] = t % 10;
t /= 10;
}
for (int i = k - 1; i >= 0; i -- ) printf("%d", a[i]);
return 0;
}