第五届新生程序设计竞赛正式赛(C语言)

A: 超级水题

一年一度的HNUCM新生赛一般都会有一道超级水题,今年仍不例外。

俗话说:聚沙成塔,积水成渊。

假设第1天有1滴水,第2天有2滴水,第3天有3滴水,以此类推,请问到第N天一共累计有多少滴水?

输入

单组输入。

输入一个正整数N(N<=1000)。

输出

输出到第N天一共累计的水滴数。

样例输入 Copy
复制代码
4
样例输出 Copy
复制代码
10
#include <stdio.h>
void solve() {
    int n;
    long long s = 0;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        s += i;
    }
    printf("%lld\n", s);
}
int main() {
    solve();
    return 0;
}

B: hy的整数翻转

hy拿到了一个正整数x ,她希望把这个整数的 k 进行翻转。你能帮帮她吗?

输入

第一行输入一个正整数T(1≤T≤1000)。

接下来输入T行,每行包含两个正整数 X 和 k,用空格隔开。

1≤x≤109

k保证不超过x的位数。

输出
复制代码
翻转后的正整数。请注意不要带前导零。
样例输入 Copy
复制代码
1
123 2
样例输出 Copy
复制代码
213
提示
复制代码
将前两位反转后,12变成了21。正整数变成了213。
#include <stdio.h>
#include <string.h>
char str[1000];
void solve() {
    scanf("%s", str);
    int n;
    scanf("%d", &n);
    int flag = 1;
    int len = strlen(str);
    for (int i = n - 1; i >= 0; i--) {
        if (str[i] == '0' && flag) {
            continue;
        } 
		else {
            flag = 0;
            printf("%c",str[i]);
        }
    }
    for (int i = n; i < len; i++) {
        printf("%c",str[i]);
    }
	printf("\n");
}
int main() {
	int t;
	scanf("%d", &t);
	while(t--)
    	solve();
    return 0;
}

C: 奶牛牧场

美丽的含浦有一片奶牛牧场,牧场上的牧草每天都在匀速生长。

已知这片牧场可供N1头奶牛吃D1天,也可以供N2头奶牛吃D2天(D1>D2,N1*D1>N2*D2)。

请问,这片奶牛牧场每天新生的草量可以供几头奶牛吃1天?

输入

单组输入,每组两行。

第1行输入两个正整数N1和D1,均不超过100。

第2行输入两个正整数N2和D2,均不超过100。

已知输入数据满足D1>D2且N1*D1>N2*D2。

输出

计算每天新生草量可以供多少头奶牛吃1天,输出奶牛的头数。

样例输入 Copy
复制代码
20 15
25 10
样例输出 Copy
复制代码
10
#include <stdio.h>
void solve() {
    int n1, d1, n2, d2;
    scanf("%d%d%d%d", &n1, &d1, &n2, &d2);
    int s = n1 * d1 - n2 * d2;
    printf("%d\n", s / (d1 - d2));
}
int main() {
    solve();
    return 0;
}

D: GCD

给两个正整数分别为A和B,现在你需要按要求进行以下两种操作。

  • 如果A>=B,A=A−B

  • 如果A<B,B=B−A

问你需要进行几次操作,使A==B。

输入

每个测试包含多个测试用例。第一行包含一个整数 t( 1≤t≤5×105 ) 表示测试用例的数量。

测试用例说明如下,每个测试用例包含两个正整数 a b ( 1≤a,b≤109 )

输出

对于每个测试用例,输出需要操作的次数。

样例输入 Copy
复制代码
2
10 5
3 3
样例输出 Copy
复制代码
1
0
#include <stdio.h>
void solve() {
    int t;
    scanf("%d", &t);
    while (t--) {
        int a, b;
        scanf("%d%d", &a, &b);
        if (a < b) {
            int temp = a;
            a = b;
            b = temp;
        }
        int s = 0;
        while (1) {
            if (a % b != 0) {
                s += a / b;
                a %= b;
            } else {
                s += a / b - 1;
                break;
            }
            int temp = a;
            a = b;
            b = temp;
        }
        printf("%d\n", s);
    }
}
int main() {
    solve();
    return 0;
}

E: 孪生花朵

有一种植物会开出N片花瓣的花朵,每一片花瓣的长度都为一个[1, 5]之间的数字。

如果两朵花具有完全相同顺序和长度的N片花瓣,则称它们为孪生花朵。

现在给出两朵花的N片花瓣的长度,请编写一个程序判断它们是不是孪生花朵。

注意:花朵的花瓣会构成一个环。例如:假设两朵花都具有5片花瓣,第1朵花5片花瓣的长度为:1 2 3 4 5,第2朵花5片花瓣的长度为:4 5 1 2 3 ,它们是一对孪生花朵。

输入

单组输入。

第1行输入一个正整数N,表示花瓣的数量,N<=100。

第2行输入N个1-5之间的数字,表示第1朵花每一片花瓣的长度。

第3行输入N个1-5之间的数字,表示第2朵花每一片花瓣的长度。

输出

如果两朵花是一对孪生花朵则输出"Yes",否则输出"No"。

样例输入 Copy
复制代码
5
1 2 3 4 5
5 4 3 2 1
样例输出 Copy
复制代码
No
#include <stdio.h>
int a[205],b[205];
void solve() {
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
    }
    for (int i = 1; i <= n; i++) {
        scanf("%d", &b[i]);
        b[i + n] = b[i];
    }
    for (int i = 1; i <= n; i++) {
        int f=1;
        for (int j = i; j <= i + n - 1; j++) {
            if (a[j - i + 1] != b[j]) {
                f = 0;
                break;
            }
        }
        if (f) {
            printf("Yes\n");
            return;
        }
    }
    printf("No\n");
}
int main() {
    solve();
    return 0;
}

F: 存钱能手

Kim打算存钱买一台新电脑(最近目标:华硕 ROG枪神7Plus 超竞版),他决定慢慢养成存钱的好习惯。

第1天他存了1元钱,接下来两天(第2天和第3天)他每天存了2元钱,再接下来三天(第4天、第5天和第6天)他每天存了3元钱,再接下来四天他每天存了4元钱,......,以此类推,请问到第n天时Kimi一共存了多少钱?

输入

单组输入。

输入一个不超过1000的正整数。

输出

输出第n天结束时Kimi存的总钱数(单位:元)。

样例输入 Copy
复制代码
8
样例输出 Copy
复制代码
22
#include <stdio.h>
void solve(){
    int n;
    scanf("%d", &n);
    long long s = 0;
    int i;
    for(i = 0; ;i++){
        s += (long long)i * i;
        n -= i;
        if(n < 0) {
            break;
        }
    }
    n += i;
    s -= (long long)(i * (i - n));
    printf("%lld\n", s);
}
int main(){
    solve();
    return 0;
}

G: 涂色问题

Kimi这几天在给一堆积木涂色,他遇到一个这样的问题:

现在有一面由n*n个小立方体拼成的墙,每一行有n个小立方体,一共n层。现在Kimi要给这面墙涂满颜色,与地面接触的底面不需要涂色,Kimi想知道有多少个两面涂色的小立方体?

现在给出一个3*3的墙的实例,一共有9个小立方体,给该墙的正面、侧面、背面和顶面涂色后,每个小立方体的涂色面的数量如下所示:

4 3 4

3 2 3

3 2 3

在上面的实例中,我们可以看到两面涂色的小立方体有2个。

现在请你编写一个程序计算在这面墙中两面涂色的小立方体的个数。

输入

单组输入。

输入一个正整数n,n<=100。

输出

输出两面涂色的小立方体的个数。

样例输入 Copy
复制代码
4
样例输出 Copy
复制代码
6
#include <stdio.h>
void solve(){
    int n;
    scanf("%d", &n);
    printf("%d\n", (n-1)*(n-2));
}
int main(){
    solve();
    return 0;
}

H: 翻转扑克牌

有N张扑克牌(3<=N<=100),在初始状态下这N张扑克牌都是背面朝上。每次你可以任意翻转3张扑克牌,背面朝上翻转后会变成正面朝上,正面朝上翻转后会变成背面朝上。

请问最少翻转多少次之后可以将这N张扑克牌全部都翻转为正面朝上。当然,也许不存在一种方案可以将这N张扑克牌全部都翻转为正面朝上。

输入

单组输入。

输入一个正整数N表示扑克牌的数量(3<=N<=100)。

输出

输出一个整数,如果可以将这N张扑克牌全部都翻转为正面朝上,输出最少需要翻转的次数;如果不能够将所有扑克牌全部都翻转为正面朝上则输出-1。

样例输入 Copy
复制代码
5
样例输出 Copy
复制代码
#include <stdio.h>
void solve(){
    int n;
    scanf("%d", &n);
    if(n == 4) {
        printf("4\n");
        return;
    }
    if(n == 7) {
        printf("3\n");
        return;
    }
    if(n < 3 || n > 100) {
        printf("-1\n");
        return;
    }
    if(n % 3 == 0) {
        printf("%d\n", n / 3);
        return;
    }
    if(n % 3 == 1) {
        printf("%d\n", 1 + n / 3);
        return;
    }
    if(n % 3 == 2) {
        printf("%d\n", (n / 3 - 1) + 3);
        return;
    }
}
int main() {
    solve();
    return 0;
}

I: 唯一字符

输入一个长度不超过20的字符串,该字符串仅包含大写字母和小写字母。

请编写一个程序,统计在字符串中只出现一次的字符的个数(注意:区分字母大小写);如果在字符串中不存在只出现一次的字符,则输出"Not Found"。

输入

单组输入。

输入一个长度不超过20,且只包含大写字母和小写字母的字符串。

输出

输出在字符串中只出现一次的字符的个数,如果不存在则输出"Not Found"。

样例输入 Copy
复制代码
AbbBCcDA
样例输出 Copy
复制代码
4
#include <stdio.h>
#include <string.h>
#define N 1005
int b[N];
char a[N];
void solve( {
    scanf("%s", a);
    for (int i = 0; i < strlen(a); i++) {
        b[a[i]]++;
    }
    int s = 0;
    for (int i = 0; i < 1000; i++) {
        if (b[i] == 1) {
            s++;
        }
    }
    if (s != 0) {
        printf("%d\n", s);
    } 
	else {
        printf("Not Found\n");
    }
}
int main() {
    solve();
    return 0;
}

J: 最萌身高差

N个(3<=N<=1000)X星人站成一行,每个X星人的身高都是一个正整数(范围:100-300,单位:厘米)。

计算相邻两个X星人的身高差(身高差为非负数),其中最大的身高差称为最萌身高差。请编写一个程序输出由N个X星人排成的这一行的最萌身高差。

输入

单组输入。

第1行输入一个正整数N(3<=N<=1000)。

第2行输入N个正整数,分别表示每一个X星人的身高,每一个正整数的范围为[100, 300],两两之间用英文空格隔开。

输出

输出一个非负整数表示这一行X星人的最萌身高差。

样例输入 Copy
复制代码
5
120 178 156 172 200
样例输出 Copy
复制代码
58
#include <stdio.h>
#include <stdlib.h>
#define N 1005
int a[N];
void solve() {
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }
    int m = -1;
    for (int i = 0; i < n - 1; i++) {
        int d = abs(a[i + 1] - a[i]);
        if (d > m) {
            m = d;
        }
    }
    printf("%d\n", m);
}
int main() {
    solve();
    return 0;
}

K: 最大矩形

输入一个只包含0和1的二维整型数组,请编写一个程序计算全部由0组成的最大矩形的大小(即包含的0的个数)。

例如:输入一个如下4行5列二维整型数组,其中包含的全部为0组成的最大矩形的大小为6(对应左下部分两行三列0所组成的矩阵,一共包含6个0)。

11000

10100
000 11
00010

输入

单组输入。

第一行输入二维数组的行数M和列数N,M和N均为大于等于1且小于等于1000的正整数。

接下来M行每行包含N个整数(整数为0或者1)。

输出

输出一个整数,表示全部为0组成的最大矩形的大小。

样例输入 Copy
复制代码
4 5
11000
10100
00011
00010
样例输出 Copy
复制代码
6
#include <stdio.h>
#define N 2005
int a[N], h[N], l[N], r[N];
void solve() {
    int m, n;
    scanf("%d%d", &m, &n);
    int mx, mn;
    for (int i = 1; i <= m; i++) {
        l[i] = r[i] = i;
    }
    int s = 0;
    for (int i = 1; i <= m; i++) {
        mx = 1;
        mn = n;
        for (int j = 1; j <= n; j++) {
            scanf("%1d", &a[j]);
            if (a[j] == 0) {
                h[j]++;
            } 
			else {
                h[j] = 0;
            }
            if (a[j] == 1) {
                mx = j + 1;
            }
            if (a[j] == 0) {
                l[j] = (l[j] > mx) ? l[j] : mx;
            } 
			else {
                l[j] = 1;
            }
        }
        for (int j = n; j > 0; j--) {
            if (a[j] == 1) {
                mn = j - 1;
            }
            if (a[j] == 0) {
                r[j] = (r[j] < mn) ? r[j] : mn;
            } else {
                r[j] = n;
            }
            s = (s > h[j] * (r[j] - l[j] + 1)) ? s : h[j] * (r[j] - l[j] + 1);
        }
    }
    printf("%d\n", s);
}
int main() {
    solve();
    return 0;
}

L: 回文七进制

自从第一个X星人诞生以来,他们一直使用的是七进制。

小X觉得普通的七进制数没有啥意思,他觉得一个七进制数如果还是一个回文数会比较有意思。

现在请你编写一个程序,将一个十进制正整数转成七进制,如果这个数是一个回文七进制数则输出转换之后的七进制数,否则输出"No interest"。

输入

单组输入。

输入一个十进制正整数N,N不超过10^6。

输出

如果N转成七进制之后是一个回文数,则输出转换之后的七进制数,否则输出"No interest"。

样例输入 Copy
复制代码
57
样例输出 Copy
复制代码
111
#include <stdio.h>
#include <string.h>
#define N 1000005
char s[N];
int fun1() {
    int n = strlen(s);
    for (int i = 0; i < n / 2; i++) {
        if (s[i] != s[n - i - 1]) {
            return 0;
        }
    }
    return 1;
}
void fun(int n) {
    int idx = 0;
    while (n) {
        s[idx++] = (n % 7) + '0';
        n /= 7;
    }
    s[idx] = '\0';
    int len = strlen(s);
    for (int i = 0; i < len / 2; i++) {
        char t = s[i];
        s[i] = s[len - i - 1];
        s[len - i - 1] = t;
    }
}
void solve() {
    int n;
    scanf("%d", &n);
    fun(n);
    if (fun1()) {
        printf("%s\n", s);
    } else {
        printf("No interest\n");
    }
}
int main() {
    solve();
    return 0;
}
相关推荐
网络点点滴13 分钟前
声明式和函数式 JavaScript 原则
开发语言·前端·javascript
利刃大大14 分钟前
【Linux系统编程】二、Linux进程概念
linux·c语言·进程·系统编程
stevewongbuaa1 小时前
一些烦人的go设置 goland
开发语言·后端·golang
撸码到无法自拔2 小时前
MATLAB中处理大数据的技巧与方法
大数据·开发语言·matlab
Icomi_2 小时前
【外文原版书阅读】《机器学习前置知识》1.线性代数的重要性,初识向量以及向量加法
c语言·c++·人工智能·深度学习·神经网络·机器学习·计算机视觉
apocelipes2 小时前
Linux glibc自带哈希表的用例及性能测试
c语言·c++·哈希表·linux编程
island13142 小时前
【QT】 控件 -- 显示类
开发语言·数据库·qt
Tanecious.2 小时前
C语言--分支循环实践:猜数字游戏
android·c语言·游戏
sysu632 小时前
95.不同的二叉搜索树Ⅱ python
开发语言·数据结构·python·算法·leetcode·面试·深度优先