Welcome to LHY's Blog!

经典语法题

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;
}

posted @ 2023-05-28 09:39  LiHaoyu  阅读(66)  评论(0)    收藏  举报