C语言题目

1.期末成绩

猿小刚同学最近学习了C++入门课程,这门课程的总成绩计算方法是:
总成绩 = 平时成绩 × 20% + 课堂测试成绩 × 10% + 期中考试成绩 × 20% + 期末考试成绩 × 50%
猿小刚想知道,这门课程自己最终能得到多少分。

输入
输入只有 1 行,包含四个非负整数A、B、C、D,分别表示猿小刚的平时成绩、课堂测试成绩、期中考试成绩、期末考试成绩。
相邻两个数之间用一个空格隔开,四项成绩满分都是 100 分。
输出
输出只有 1 行,包含一个整数,即猿小刚这门课程的总成绩,满分也是 100分。(计算的结果四舍五入)
样例输入
100 80 90 70
样例输出
81

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    int A, B, C, D;
    cin >> A >> B >> C >> D;
    double score = A * 0.2 + B * 0.1 + C * 0.2 + D * 0.5;
    cout << round(score) << endl;
    return 0;
}
//注意要将最终成绩四舍五入取整,可以使用 <cmath> 中的 round 函数实现。

2.程序设计大赛

题目描述
某高校准备举办一次程序设计大赛,这场比赛需要两人一队组队参加,他们不知道怎么分组。已知他们的预赛分数分别为 a, b, c, d,现在想要把他们两两分为一队,使得他们的实力比较平均,也就是两队的实力差尽量小。这里定义两队的实力差为每队的预赛分数之和的差值,现在他们想要知道这个实力差最小是多少。

输入
仅一行,包含四个整数a,b,c,d (1≤a,b,c,d≤1,000,000),中间以空格分隔,分别表示四个人的预赛分数。
输出
在一行输出一个整数,表示两个队伍实力差的最小值。
样例输入
4 2 5 1
样例输出
0

#include <iostream>
#include <algorithm>
using namespace std;

int main() {
    int a, b, c, d;
    cin >> a >> b >> c >> d;
    int arr[4] = {a, b, c, d};
    sort(arr, arr + 4); // 排序
    int sum1 = arr[0] + arr[3];
    int sum2 = arr[1] + arr[2];
    int diff = abs(sum1 - sum2);
    cout << diff << endl;
    return 0;
}

3.完美分组

题目描述
一年一度完美分组大赛又要开始了,大赛要求将在场的N个人分为两组,比赛开始时赛题方会告诉你在场的总人数,问你能否将这N个人分成两组,每组都是偶数。
注意:这里说的是能否分成两组,不需要平分。

输入
输入一行,包含一个整数N,表示在场的总人数1 <= N <= 50000
输出
如果能分成两组输出,“YES, Right!”;否则输出“NO, Error!”。
样例输入
5
样例输出
NO, Error!

#include <iostream>
using namespace std;

int main() {
    int N;
    cin >> N;
    if (N % 2 == 1) {
        cout << "NO, Error!" << endl;
    } else {
        if ((N / 2) % 2 == 0) {
            cout << "YES, Right!" << endl;
        } else {
            cout << "NO, Error!" << endl;
        }
    }
    return 0;
}

4.电子货币

题目描述
近期,某高校推出了一款属于校内流通的电子货币“某高校币”,这一天某高校将某高校币作为工资,发放给认真科研的硕士生A。第一天,硕士生A收到一枚某高校币;之后两天(第二天和第三天),每天收到两枚某高校币;之后三天(第四、五、六天),每天收到三枚某高校币;之后四天(第七、八、九、十天),每天收到四枚某高校币……;这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚某高校币后,硕士生A会在之后的连续N+1天里,每天收到N+1枚某高校币。
请计算在前K天里,硕士生A一共获得了多少枚某高校币。

输入
输入只有1行,包含一个正整数K,表示给硕士生A发放某高校币的天数。
数据规模:
对于100%的数据,1 ≤ K ≤ 1,000,000
输出
输出只有1行,包含一个正整数,即硕士生A收到的某高校币枚数。
样例输入
5
样例输出
11

#include <iostream>
using namespace std;

int main() {
    int K;
    cin >> K;
    int sum = 0; // 累加器,记录硕士生A收到的青大币总数
    int days = 0; // 经过的天数
    int cnt = 1; // 当前连续天数下每天应该获得的青大币个数
    while (days < K) {
        for (int i = 0; i < cnt && days < K; i++) {
            sum += cnt;
            days++;
        }
        cnt++;
    }
    cout << sum << endl;
    return 0;
}

5.质因数分解

题目描述
已知正整数n是两个不同的质数的乘积,试求出两者中较大的那个质数。

输入
输入一个正整数n

【数据范围】
1<=n<=2*10^9

输出
输出一个正整数p,即较大的那个质数
样例输入
21
样例输出
7

//只要找到最小的余数为0的因数即可 ,那么另一个因数就是最大的 
#include<cstdio>
int main() {
	int n;
	scanf("%d", &n);
	for (int i = 2; i <= n; i++) {
		if (n % i == 0) {
			printf("%d", n / i);
			break;
		}
	}
	return 0;
}

6.排序及去重

题目描述
现有N个1到1000之间的随机数,现要求将这些随机数进行排序和去重后输出

输入
输入有两行
第1行为一个正整数N
第2行有N个用空格隔开的随机数

【数据范围】
1<=N<=1000

输出
输出有两行
第1行为一个正整数M,表示不相同的随机数
第2行有M个用空格隔开的正整数,为从小到大排好序的不相同的随机数
样例输入
10
20 40 32 67 40 20 89 300 400 15
样例输出
8
15 20 32 40 67 89 300 400

#include<stdio.h>
int main() {
    int N, a[1001] = { 0 }, t, i;
    int count = 0;
    scanf("%d", &N);
    for (i = 0; i < N; i++) {
        scanf("%d", &t);
        if (a[t] == 0) {
            a[t] = t;
            count++;
        }
    }
    printf("%d\n", count);
    for (i = 0; i < 1001; i++) {
        if (a[i] != 0)
            printf("%d ", a[i]);
    }
    return 0;
}

7.合法数列

题目描述
给定正整数n,按如下方式构造数列:
1.n是合法数列
2.在一个合法数列的末尾加入一个不超过末尾数一半的数可以得到一个新的合法数列
求出一共有多少个合法数列

输入
一行一个正整数n

【数据范围】
1<=n<=10^3

输出
输出一行一个整数,表示合法的数列个数
样例输入
6
样例输出
6
提示
【样例解释】

满足条件的数列为:
l 6
l 6,1
l 6,2
l 6,3
l 6,2,1
l 6,3,1

#include <iostream>
using namespace std;
const int MAXN = 30;
int f[MAXN];
int main() {
	int n;
	cin >> n;
	f[1] = 1;
	for (int i = 2; i <= n; i++) {
		for (int j = 1; j <= i / 2; j++) {
			f[i] += f[j];
		}
		f[i]++;
	}
	cout << f[n] << endl;
	return 0;
}

8.打印简单图案

题目描述
输出全是大写字母的“沙漏”形状的图案,范围:(A~Z)
输入
一个大写字母(该字母位于第一行和最后一行的中间)
输出
对应的形状
样例输入
D
样例输出
ABCDCBA
ABCBA
ABA
A
ABA
ABCBA
ABCDCBA

#include <iostream>
using namespace std;

void printRow(int spaceNum, int charNum, char c) { // 打印一行
    for (int i = 0; i < spaceNum; i++)
        cout << " ";
    for (char i = 'A'; i < 'A' + charNum; i++)
        cout << i;
    for (char i = 'A' + charNum - 2; i >= 'A'; i--)
        cout << i;
    cout << endl;
}

int main() {
    char c;
    cin >> c;

    int row = c - 'A' + 1; // 行数
    for (int i = 0; i < row; i++) { // 输出上半部分
        printRow(i, row - i, c);
    }
    for (int i = row - 2; i >= 0; i--) { // 输出下半部分
        printRow(i, row - i, c);
    }
    return 0;
}

9.简单题

题目描述
给到两个正整数a,b。你需要求a的b次方为多少。
同时为了让题目不要这么简单,我们做如下要求:

  1. 若a的b次方不超过10^9,则输出结果
  2. 若超过,则输出-1

输入
两个正整数a,b
1<=a,b<=10^9
输出
按照题意输出
样例输入
10 9
样例输出
1000000000
提示
23333 66666
-1

#include<iostream>
#include<cmath>
using namespace std;

int main()
{
	long long a, b;
	cin >> a >> b;
	long long c=pow(a,b);
	if (pow(a, b) > pow(10, 9))
	{
		cout << "-1";
	}
	else
		cout << c;
}

10.简单加密算法

题目描述
将数字09,大写字母AZ,小写字母a~z,按从左到右,从上到下的顺序填入到一个8×8的矩阵中,接下来使用每个字符所在的行号和列号(均从0开始编号)对该字符进行加密。现给定一个字符串,要求对其进行加密。

输入
输入包括一个长度不超过1000的字符串。
输出
输出该字符串对应的密文。
样例输入
123ABC
样例输出
010203121314

#include <iostream>
using namespace std;

const string s = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

void get_pos(char c, int& r, int& col) {
    auto it = find(s.begin(), s.end(), c);
    int pos = it - s.begin();
    col = pos % 8;
    r = (pos - col) / 8;
}

int main() {
    string str;
    cin >> str;
    for (char c : str) {
        int r, col;
        get_pos(c, r, col);
        cout << r   << col;
    }
    cout << endl;
    return 0;
}

11.画直线找整点

题目描述
现给定XOY平面第一象限内长宽分别为31的网格,并给定两个点P1(x1,y1),P2(x2,y2),由此可以确定一条直线,现要求这条直线经过的所有整点。整点需要满足以下要求:1)x坐标必须是整数,2)y坐标四舍五入到较近的整数。比如当给定的两个顶点是P1(0,0),P2(7,5)时,如下图所示的红色格点和蓝色格点就是部分经过的整点。现给定P1和P2,要求输出直线在网格范围内经过的所有整点。

输入
输入包含1行4这整数,x1,y1,x2,y2 (范围均位于[0,30])。
输出
输出包括多行,表示直线在网格范围内( x∈[0,30], y∈[0,30]) 经过的所有整点。
样例输入
0 0 7 5
样例输出
0,0
1,1
2,1
3,2
4,3
5,4
6,4
7,5
8,6
9,6
10,7
11,8
12,9
13,9
14,10
15,11
16,11
17,12
18,13
19,14
20,14
21,15
22,16
23,16
24,17
25,18
26,19
27,19
28,20
29,21
30,21

#include <iostream>
#include <cmath>
using namespace std;

int main() {
	int x1, y1, x2, y2;
	cin >> x1 >> y1 >> x2 >> y2;
	double k = (y2 - y1) * 1.0 / (x2 - x1);
	double b = y1 - k * x1;

	for (int x = 0; x <= 30; x++) {
		int y = round(k * x + b);
		if (0 <= y && y <= 30)
			cout << x << "," << y << endl;
	}
	return 0;
}

12.找到始作俑者

题目描述
这道题加点小技巧!给定一个数X,X加上其每一位的数字之和可以得到一个新的数Y, 那么我们就认为X可以生成Y,比如X=123,那么Y=123+1+2+3=129,我们就说123可以生成129。 对于某些Y可能被多个X生成,比如Y=101, X=91或100均可生成Y。 因此,如果有多个符合条件的,我们希望找到最小的那个X,它被称为始作俑者, 当然也有可能某些数不能被别的数生成,如Y=20。

输入
第一行一个整数N(N<= 100000)
输出
接下来N行,每行一个整数Y(Y <= 100000)
样例输入
5
100
50
88
20
10
样例输出
86
43
80
0
5

#include <iostream>
using namespace std;

int sum_digits(int n) {
    int sum = 0;
    while (n) {
        sum += n % 10;
        n /= 10;
    }
    return sum;
}

int solve(int y) {
    for (int x = max(1, y - 45); x <= y; x++) {
        if (x + sum_digits(x) == y) {
            return x;
        }
    }
    return 0;
}

int main() {
    int n;
    cin >> n;
    while (n--) {
        int y;
        cin >> y;
        cout << solve(y) << endl;
    }
    return 0;
}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兴趣使然的Qsiri

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值