欢迎来到XDU XDOJ C语言题解题库!
此项目旨在为正在学习C语言的XDUer提供XDOJ题库一些题目的题解。
尽管个人投入了许多时间来整理维护这些题目,但由于单人精力有限,题库难以做到全面覆盖。
我们真诚地邀请每一位有兴趣的XDUer,如果你有意愿贡献新题目及其题解,欢迎联系
kisrx@outlook.com
- 0.CodeSnippets
- 2
- 3
- 5
- 6
- 7
- 9
- 10
- 11
- 15
- 16
- 18
- 19
- 20
- 21
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 64
- 65
- 67
- 68
- 69
- 71
- 73
- 74
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 98
- 108
- 109
- 110
- 111
- 112
- 113
- 125
- 126
- 133
- 134
- 135
- 139
- 149
- 150
- 167
- 169
- 170
- 171
- 173
- 177
- 185
- 215
- 219
- 221
- 224
- 227
- 228
- 229
- 230
- 240
- 241
- 242
- 243
- 301
- 374
- 385
- 388
- 390
- 391
- 392
- 398
- 405
- 406
- 425
- 449
- 457
- 458
- 459
- 460
- 461
- 464
- 490
- 525
- 526
- 528
- 540
- 545
- 563
- 568
- 569
- 570
- 571
- 572
- 573
- 583
- 601
- 604
- 612
- 613
- 615
- 616
- 641
- 671
- 672
- 673
- 674
- 675
- 676
- 677
- 680
- 681
- 682
- 683
- 684
- 685
- 686
- 687
- 688
- 689
- 690
- 691
- 692
- 693
- 694
- 695
- 696
- 697
- 698
- 699
- 700
- 701
- 702
- 703
- 704
- 705
- 706
- 707
- 708
代码
Last Update: 2024-10-24 11:17:18, total 179
0.CodeSnippets
/**
* That Code Snippets was written by flew_kites
* snippets means several lines of code which could be applied to many programs
* I listed some snippets, for copying from here and paste them to improve efficiency
*/
/*
_ooOoo_
o8888888o
88" . "88
(| -_- |)
O\ = /O
____/`---'\____
.' \\| |// `.
/ \\||| : |||// \
/ _||||| -:- |||||- \
| | \\\ - /// | |
| \_| ''\---/'' | |
\ .-\__ `-` ___/-. /
___`. .' /--.--\ `. . __
."" '< `.___\_<|>_/___.' >'"".
| | : `- \`.;`\ _ /`;.`/ - ` : | |
\ \ `-. \_ __\ /__ _/ .-` / /
======`-.____`-.___\_____/___.-`____.-'======
`=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
*/
/**
* ! XDOJ prefer scanf("%[^\n]", str) to fgets(str, MAXLEN, stdin)
*
* ! Localy fgets() will read '\n' into str
* ! But XDOJ will not
*
*/
/**
* Get the substring from a certain another
*/
void subString(const char *src, int start, int end, char *result) {
int length = strlen(src);
int j = 0;
for (int i = start; i <= end; i++) {
result[j++] = src[i];
}
result[j] = '\0';
}
/**
* Sort increasingly
* a: int array
* count: count
*/
void sort(int* a, int count){
for(int i = 0; i < count-1; i++){
for(int j = 0; j < count-1-i; j++){
//compare & swap
if(a[j] > a[j+1]){
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}
/**
* Sort 2
* a: int array
* count: count
*/
void sort2(int* a, int count){
for(int i = 0; i < count; i++){
for(int j = i+1; j < count; j++){
//compare & swap
if(a[j] > a[i]){
int temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
}
}
/**
* Get the sum of every digits of 'n' into tar
*/
int getSum(int tar[], int n){
int r = 0;
for(int i = 0; i < n; i++){
r += tar[i];
}
return r;
}
/**
* accept a valid number
* return 1 if it is a prime number
* or return 0 if not
*/
int isPrime(int n){
if(n == 1) return 0;
for(int i = 2; i <= n/2; i++){
if(n%i == 0){
return 0;
}
}
return 1;
}
/**
* parse factors from num
* store result to tar[]
* and return the number of factors
*/
int parseFactor(int num, int tar[]){
int index = 0;
for(int i = 1; i < num; i++){
if(num % i == 0){
tar[index] = i;
index++;
}
}
return index;
}
/**
* parse the number from a string
* return that number
*/
int parseNumber(char* str){
int a[100];
int n = 0;
for(int i = 0; str[i] != '\0'; i++){
if(str[i] >= '0' && str[i] <= '9'){
a[n++] = str[i] - '0';
}
}
int num = 0;
for(int i = 1; i < n; i++){
num = num * 10 + a[i];
}
return num;
}
/**
* Swap a & b
*/
void swap(int* a, int* b){
//Do not remove this unless you know what will happen
if(*a == *b) return;
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
2
/*
题目2:数列分段
问题描述
给定一个整数数列,数列中连续相同的最长整数序列算成一段,问数列中共有多少段?
输入格式
输入的第一行包含一个整数n,表示数列中整数的个数。
第二行包含n个整数a1, a2, …, an,表示给定的数列,相邻的整数之间用一个空格分隔。
输出格式
输出一个整数,表示给定的数列有多个段。
样例输入
8
8 8 8 0 12 12 8 0
样例输出
5
样例说明
8 8 8是第一段,0是第二段,12 12是第三段,倒数第二个整数8是第四段,最后一个0是第五段。
评测用例规模与约定
1 ≤ n ≤ 1000,0 ≤ ai ≤ 1000。
*/
#include <stdio.h>
int main(){
int count, num = 1;
int temp, now;
scanf("%d", &count);
scanf("%d", &temp);
for(int i = 1; i<count; i++){
scanf("%d", &now);
if(temp != now){
temp = now;
num++;
}
}
printf("%d", num);
}
3
/*
题目3:最小差值
问题描述
给定n个数,请找出其中相差(差的绝对值)最小的两个数,输出它们的差值的绝对值。
输入格式
输入第一行包含一个整数n。
第二行包含n个正整数,相邻整数之间使用一个空格分隔。
输出格式
输出一个整数,表示答案。
样例输入
5
1 5 4 8 20
样例输出
1
样例说明
相差最小的两个数是5和4,它们之间的差值是1。
样例输入
5
9 3 6 1 3
样例输出
0
样例说明
有两个相同的数3,它们之间的差值是0.
数据规模和约定
对于所有评测用例,2 ≤ n ≤ 1000,每个给定的整数都是不超过10000的正整数。
*/
#include <stdio.h>
#include <math.h>
int sub(int a, int b){
return abs((a-b));
}
int main(){
// define
int count;
int min = 0;
int num[1001];
// input
scanf("%d", &count);
for(int i = 0; i < count; i++){
scanf("%d", &num[i]);
}
// init min
min = sub(num[0], num[1]);
// iterate
for(int i = 0; i < count; i++){
for(int j = i+1; j <= count-1; j++){
if(min > sub(num[i], num[j])){
min = sub(num[i], num[j]);
// ^Error
}
}
}
// output
printf("%d", min);
}
5
//AI
/*
题目5:消除类游戏
问题描述
消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消除。当有多处可以被消除时,这些地方的棋子将同时被消除。
现在给你一个n行m列的棋盘,棋盘中的每一个方格上有一个棋子,请给出经过一次消除后的棋盘。
请注意:一个棋子可能在某一行和某一列同时被消除。
输入格式
输入的第一行包含两个整数n, m,用空格分隔,分别表示棋盘的行数和列数。
接下来n行,每行m个整数,用空格分隔,分别表示每一个方格中的棋子的颜色。颜色使用1至9编号。
输出格式
输出n行,每行m个整数,相邻的整数之间使用一个空格分隔,表示经过一次消除后的棋盘。如果一个方格中的棋子被消除,则对应的方格输出0,否则输出棋子的颜色编号。
样例输入1
4 5
2 2 3 1 2
3 4 5 1 4
2 3 2 1 3
2 2 2 4 4
样例输出1
2 2 3 0 2
3 4 5 0 4
2 3 2 0 3
0 0 0 4 4
样例说明
棋盘中第4列的1和第4行的2可以被消除,其他的方格中的棋子均保留。
样例输入2
4 5
2 2 3 1 2
3 1 1 1 1
2 3 2 1 3
2 2 3 3 3
样例输出2
2 2 3 0 2
3 0 0 0 0
2 3 2 0 3
2 2 0 0 0
样例说明
棋盘中所有的1以及最后一行的3可以被同时消除,其他的方格中的棋子均保留。
评测用例规模与约定
所有的评测用例满足:1 ≤ n, m ≤ 30。
*/
#include <stdio.h>
#include <string.h>
#define MAX 30
int board[MAX][MAX];
int mark[MAX][MAX];
void markRow(int n, int m) {
for (int i = 0; i < n; i++) {
int j = 0;
while (j < m) {
int k = j;
while (k < m && board[i][k] == board[i][j]) k++;
if (k - j >= 3)
for (int l = j; l < k; l++) mark[i][l] = 1;
j = k;
}
}
}
void markColumn(int n, int m) {
for (int j = 0; j < m; j++) {
int i = 0;
while (i < n) {
int k = i;
while (k < n && board[k][j] == board[i][j]) k++;
if (k - i >= 3)
for (int l = i; l < k; l++) mark[l][j] = 1;
i = k;
}
}
}
int main() {
int n, m;
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
scanf("%d", &board[i][j]);
memset(mark, 0, sizeof(mark));
markRow(n, m);
markColumn(n, m);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (mark[i][j]) printf("0 ");
else printf("%d ", board[i][j]);
}
printf("\n");
}
return 0;
}
6
#include <stdio.h>
int getSum(int num){
int r = 0;
while(num > 0){
r += num % 10;
num /= 10;
}
return r;
}
/**
* sumA < sumB ? 1 : 0
* if sumA == sumB return a < b ? 0 : 1
*/
int compare(int a, int b){
if(getSum(a) < getSum(b)) return 1;
if(getSum(a) > getSum(b)) return 0;
return a < b ? 0 : 1;
}
void sort(int* a, int count){
for(int i = 0; i < count-1; i++){
for(int j = 0; j < count-1-i; j++){
//swap
if(compare(a[j], a[j+1])){
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}
int main(){
int user;
scanf("%d", &user);
int num[1000];
for(int i = 0; i < user; i++){
scanf("%d", &num[i]);
}
sort(num, user);
for(int i = 0; i < user; i++){
printf("%d %d\n", num[i], getSum(num[i]));
}
return 0;
}
7
/*
试题名称 车牌限行
时间限制: 1 秒
内存限制: 256KB
问题描述
受雾霾天气影响,某市决定当雾霾指数超过设定值时对车辆进行限行,假设车牌号全为数字,且长度不超过6位,限行规则如下:
(1)限行时间段只包括周一至周五,周六周日不限行;
(2)如果雾霾指数低于200,不限行;
(3)如果雾霾指数大于等于200且低于400,每天限行两个尾号的汽车,周一限行1和6,周二限行2和7,周三限行3和8,周四限行4和9,周五限行5和0;
(4)如果雾霾指数大于等于400,每天限行五个尾号的汽车,周一、周三和周五限行1,3,5,7,9,周二和周四限行0,2,4,6,8。
---
Day 1~5
<200 X
>=200, <400
现在给出星期几、雾霾指数和车牌号,判断该车牌号是否限行。
输入说明
输入分为三个整数,第一个整数表示星期几(1~7,1表示周一,2表示周二,依次类推,7表示周日),
第二个整数表示雾霾指数(0~600),第三个整数表示车牌号,整数之间用空格分隔。
输出说明
输出为两个部分,第一部分为车牌最后一位数字,第二部分为限行情况,限行输出yes,不限行输出no。
输入样例1
4 230 80801
输入样例2
3 300 67008
输出样例1
1 no
输出样例2
8 yes
*/
//Contributed from @bssbs
#include<stdio.h>
int main(){
int low[5][2] = {1,6, 2,7, 3,8, 4,9, 5,0};
int day, level, car;
int isReject;
scanf("%d %d %d", &day, &level, &car);
car = car % 10;
if(day <= 5 && level >= 200){
if(level <= 400){
if(car == low[day-1][1] || car == low[day-1][2]) isReject = 1;
else isReject = 0;
}
else if(level >400){
if(day % 2 == car % 2) isReject = 1;
else isReject = 0;
}
}
if(isReject) printf("%d yes", car);
else printf("%d no",car);
return 0;
}
9
/*
题目3 计算球体重量
问题描述
已知铁的比重是7.86,金的比重是19.3。写一个程序,分别计算出给定直径的铁球与金球的质量,假定PI=3.1415926。
输入说明
输入两个整数,分别表示铁球与金球的直径(单位为毫米)
输出说明
输出两个浮点数,分别表示铁球与金球的质量(单位为克),小数点后保留3位小数,两个浮点数之间用空格分隔
输入样例
100 100
输出样例
4115.486 10105.456
*/
#include <stdio.h>
#define PI 3.1415926
#define IRON 7.86
#define GOLD 19.3
double weight(double d, double density){
d = d / 10;
return (d*d*d*PI*density)/6.0;
}
int main(){
int i, g;
scanf("%d %d", &i, &g);
printf("%.3f %.3f", weight(i, IRON), weight(g, GOLD));
return 0;
}
10
/*
题目2 温度转换
问题描述
已知华氏温度到摄氏温度的转换公式为:摄氏温度= (华氏温度- 32)×5/9,写程序将给定的华氏温度转换为摄氏温度输出。
输入说明
只有一个整数,表示输入的华氏温度。
输出说明
输出一个表示摄氏温度的实数,小数点后保留2位有效数字,多余部分四舍五入。
输入样例
50
输出样例
10.00
*/
#include <stdio.h>
int main(){
int f;
double c;
scanf("%d", &f);
c = 5.0/9.0 * (f - 32.0);
printf("%.2f", c);
return 0;
}
11
/*
题目11:整数简单运算
问题描述:编写程序,计算用户输入的两个整数的和、差、乘积(*)和商(/)。
输入格式:输入两个整数,整数之间用空格分隔。
输出格式:输出四个整数结果,分别表示和、差、积和商,每输出一个结果换行。
输入样例:
3 4
输出样例:
7
-1
12
0
*/
#include <stdio.h>
int main(){
int a,b;
scanf("%d %d", &a, &b);
printf("%d\n", a + b);
printf("%d\n", a - b);
printf("%d\n", a * b);
printf("%d", a / b);
return 0;
}
15
/*
1. A+B+C
问题描述:
通过键盘输入三个整数a,b,c,求3个整数之和。
输入说明:
三整形数据通过键盘输入,输入的数据介于-100000和100000之间,整数之间以空格、跳格或换行分隔。
输出说明:
输出3个数的和。
输入样例:
-6 0 39
输出样例:
33
*/
#include <stdio.h>
int main(){
int a, b, c, r;
scanf("%d %d %d", &a, &b ,&c);
r = a+b+c;
printf("%d", r);
return 0;
}
16
/*
1. 字符输入输出
问题描述:
通过键盘输入5个大写字母,输出其对应的小写字母,并在末尾加上“!”。
输入说明:
5个大写字母通过键盘输入,字母之间以竖线“|”分隔。
输出说明:
输出5个大写字母对应的小写字母,之间无分隔,并在末尾加上‘!’。
输入样例:
H|E|L|L|O
输出样例:
hello!
*/
#include <stdio.h>
int main(){
char a,b,c,d,e;
scanf("%c|%c|%c|%c|%c", &a, &b, &c, &d, &e);
printf("%c", a+32);
printf("%c", b+32);
printf("%c", c+32);
printf("%c", d+32);
printf("%c", e+32);
printf("!");
}
18
/*
1. 数字字符
问题描述:
通过键盘输入1个整数a(0<=a<=4),1个数字字符b(’0’<=b<=’5’),求a+b。
输入说明:
整形数据、数字字符通过键盘输入,输入的整形数据介于0和4之间,输入的数字字符介于‘0’和‘5’之间,二个输入数之间用“,”分隔。
输出说明:
分别以整数形式及字符形式输出a+b,输出的二个数之间用“,”分隔。
输入样例:
3 ,5
输出样例:
56,8
*/
#include <stdio.h>
int main(){
short int a;
char b;
scanf("%hd,%c", &a, &b);
printf("%d,%c",a+b,a+b);
}
19
/*
1. 实数运算
问题描述:
通过键盘输入长方体的长、宽、高,求长方体的体积V(单精度)。
输入说明:
十进制形式输入长、宽、高,输入数据间用空格分隔。
输出说明:
单精度形式输出长方体体积V,保留小数点后3位,左对齐。
输入样例:
15 8.12 6.66
输出样例:
811.188
*/
#include <stdio.h>
int main(){
float l, w, h;
scanf("%f %f %f", &l, &w, &h);
printf("%-8.3f", l*w*h);
return 0;
}
20
/*
1. 四则运算
问题描述:
输入两个整数和一个四则运算符,根据运算符计算并输出其运算结果(和、差、积、商、余之一)。注意做整除及求余运算时,除数不能为零。
输入说明:
使用scanf()函数输入两个整数和一个运算符,格式见输入样例。
输出说明:
输出使用printf()函数,格式见输出样例。
输入样例:
5%2
输出样例:
5%2=1
*/
#include <stdio.h>
int main(){
short int a, b;
char c;
scanf("%hd%c%hd", &a, &c, &b);
switch(c){
case '%':
printf("%d%%%d=%d",a,b,a%b);
break;
case '+':
printf("%d+%d=%d",a,b,a+b);
break;
case '-':
printf("%d-%d=%d",a,b,a-b);
break;
case '/':
printf("%d/%d=%d",a,b,a/b);
break;
case '*':
printf("%d*%d=%d",a,b,a*b);
break;
}
}
21
/*
1. 数位输出
问题描述:
输入一个5位整数,求出其各数位数值,并按照从高位到低位的顺序输出,如:输入12345,输出为1 2 3 4 5。
输入说明:
输入一个五位正整数。
输出说明:
按数位从高到低依次输出,各数位之间以一个空格相分隔。
输入样例:
96237
输出样例:
9 6 2 3 7
*/
#include <stdio.h>
int main(){
char a[5];
scanf("%c%c%c%c%c", &a[0], &a[1], &a[2], &a[3], &a[4]);
printf("%c %c %c %c %c", a[0], a[1], a[2], a[3], a[4]);
}
/**
* 当然有老实一点的做法
#include <stdio.h>
int main(){
void swaps(char* a, char* b);
char a[5];
scanf("%c%c%c%c%c", &a[0], &a[1], &a[2], &a[3], &a[4]);
for(int i = 0; i < 5; i++){
for(int j = 0; j < 4-i; j++){
if(a[j] > a[j+1]){
swaps(&a[j], &a[j+1]);
}
}
}
printf("%c %c %c %c %c", a[0], a[1], a[2], a[3], a[4]);
}
void swaps(char* a, char* b){
*a = (*a)^(*b);
*b = (*a)^(*b);
*a = (*a)^(*b);
}
*/
27
/*
题目:阶梯电价计费
类别:流程控制
时间限制:2S
内存限制:10000Kb
问题描述:
电价分三个档次,[0,110]度电,每度电0.5元;(110,210]度电,超出110部分每度电0.55元,超过210度电,超出210部分每度电0.70元,给出一个家庭一月用电量,请计算出应缴的电费(四舍五入,保留小数点后两位小数)。
*/
// count is DOUBLE!!
#include <stdio.h>
int main(){
double money = 0;
double count;
scanf("%lf", &count);
if(1){
money += (count>=110) ? 55 : 0.5*count;
if(count > 110){
money += (count<=210) ? 0.55*(count-110) : 55;
if(count > 210){
money += 0.7*(count-210);
}
}
}
printf("%.2f", money);
}
/*
输入说明:
输入数据为一个正实数,表示一月用电量
输出说明:
输出应缴电费,保留2位小数。
输入样例:
输入样例1
100
输入样例2
200
输入样例3
329
输出样例:
输出样例1
50.00
输出样例2
104.50
输出样例3
193.30
*/
28
/*
标题:计算某月天数
类别:流程控制
时间限制:2S
内存限制:10000Kb
问题描述:
每年的1,3,5,7,8,10,12月有31天,4,6,9,11月有30天,闰年2月29天,其他年份2月28天,给定年份和月份求该月的天数
*/
#include <stdio.h>
int isLeap(int year){
return (((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) ? 1 : 0);
}
int main(){
const int days_isLeap0[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
const int days_isLeap1[12] = {31,29,31,30,31,30,31,31,30,31,30,31};
int year, month, days;
scanf("%d %d", &year, &month);
if(isLeap(year)){
days = days_isLeap1[month-1];
}else{
days = days_isLeap0[month-1];
}
printf("%d", days);
}
/*
输入说明:
输入由两个正整数a和b构成,a表示年份,b表示月份,a和b之间用空格分隔
输出说明:
根据年份和月份计算该月天数并输出
输入样例
输入样例1
2000 3
输入样例2
2001 2
输出样例
输出样例1
31
输出样例2
28
*/
29
/*
假设n是一个由最多9位数字(d9, …, d1)组成的正整数。编写一个程序计算n的每一位数字之和
输入说明:
输入数据为一个正整数n
输出说明:
对整数n输出它的各位数字之和后换行
*/
#include <stdio.h>
int main(){
int n;
int sum = 0;
scanf("%d", &n);
for(int i = 0; i < 9; i++){
sum += n%10;
n /= 10;
}
printf("%d\n", sum);
}
/*
输入样例:
3704
输出样例:
14
*/
30
/*
请写一个程序,给出指定整数范围[a,b]内的所有完数,0 < a < b < 10000。
一个数如果恰好等于除它本身外的所有因子之和,这个数就称为"完数"。
例如6是完数,因为6=1+2+3
输入说明
输入为两个整数a和b,a和b之间用空格分隔
输出说明
输出[a,b]内的所有完数,每个数字占一行
*/
#include <stdio.h>
int isOK(int num){
int sum = 0;
for(int i = 1; i <= 0.5*num; i++){
sum += (num%i == 0) ? i : 0;
}
return (sum == num) ? 1 : 0;
}
int main(){
int a,b;
scanf("%d %d", &a, &b);
for(int i = a; i <= b; i++){
if(isOK(i)) printf("%d\n", i);
}
}
31
/*
最大公约数(GCD)指某几个整数共有因子中最大的一个,最大公约数具有如下性质,
gcd(a,0)=a
gcd(a,1)=1
因此当两个数中有一个为0时,gcd是不为0的那个整数,
当两个整数互质时最大公约数为1。
输入两个整数a和b,求最大公约数
输入说明:
输入为两个非负整数a和b(0<=a,b<10000),a和b之间用空格分隔,
输出说明:
输出其最大公约数
*/
#include <stdio.h>
int min(int a, int b){
return (a>b) ? a : b;
}
int main(){
int gcd = 1;
int a, b;
scanf("%d %d", &a, &b);
for(int i = gcd; i <= min(a,b); i++){
if(a%i == 0 && b%i == 0) gcd = i;
}
printf("%d", gcd);
}
32
/*
角谷定理定义如下:
对于一个大于1的整数n,如果n是偶数,则n = n / 2。如果n是奇数,则n = 3 * n +1,反复操作后,n一定为1。
例如输入22的变化过程: 22 ->11 -> 34 -> 17 -> 52 -> 26 -> 13 -> 40 -> 20 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1,数据变化次数为15。
输入一个大于1的整数,求经过多少次变化可得到自然数1。
输入说明
输入为一个整数n,1<n<100000。
输出说明
输出变为1需要的次数
*/
#include <stdio.h>
int fun(int n){
int r;
if(n%2){
r = 3 * n + 1;
}else{
r = n / 2;
}
return r;
}
int main(){
int n, count;
scanf("%d", &n);
for(count = 0; n != 1; count++){
n = fun(n);
}
printf("%d", count);
}
33
#include <stdio.h>
double function(int n){
double last = 1;
double next = 1;
for(int i = 2; i <= n; i++){
next = 1.0/(1.0+last);
last = next;
}
return next;
}
int main(){
double n;
scanf("%lf", &n);
double v;
v = function(n);
printf("%f", v);
}
34
#include <stdio.h>
#define MAXDIG 4
int isT(int num){
int user = num; //user
int n; //Digti
int a[MAXDIG] = {-1, -1, -1, -1};
for(n = 0; user > 0; n++){
a[n] = user % 10;
user = user / 10;
}
int sum = 0;
for(int i = 0; i < n; i++){
sum = sum + a[i]*a[i]*a[i];
}
int numberT;
if(sum == num) numberT = 1;
else numberT = 0;
return numberT;
}
int fun(int a, int b){
int left = a > b ? b : a;
int right = a > b ? a : b;
int result = 0;
for(int i = left; i <= right; i++){
if(isT(i)) result++;
}
return result;
}
int main(){
//TEST printf("%d %d %d\n", isT(1), isT(153), isT(1000));
int function(int, int);
int a, b;
scanf("%d%d", &a, &b);
printf("%d\n", fun(a, b));
printf("%d", function(a, b));
return 0;
}
/**
* 提交函数片段,在此整理
*/
int function(int a, int b){
int left = a > b ? b : a;
int right = a > b ? a : b;
int result = 0;
for(int i = left; i <= right; i++){
int user = i; //user
int a[4];
int sum = 0;
int n;// Dig
for(int ii = 0; ii < 4; ii++){
a[ii] = 0;
}
for(n = 0; user > 0; n++){
a[n] = user % 10;
user = user / 10;
}
for(int j = 0; j < 4; j++){
if(n == 2) sum = sum + a[j]*a[j];
if(n == 3) sum = sum + a[j]*a[j]*a[j];
if(n == 4) sum = sum + a[j]*a[j]*a[j]*a[j];
}
if(sum == i) result++;
}
return result;
}
35
#include <stdio.h>
int isPrime(int n){
int flag = n == 1 ? 0 : 1;
for(int i = 2; i <= n/2; i++){
if(n%i == 0){
flag = 0;
break;
}
}
return flag;
}
int main(){
int user;
scanf("%d", &user);
int a = 2;
int b = user - 2;
while(b > user/2){
if(isPrime(a) && isPrime(b)) break;
a++;
b--;
}
printf("%d %d", a, b);
}
37
#include <stdio.h>
/**
* Compare T37
*/
int compare(int a, int b){
if(a%2 == 0 && b%2 == 1) return 1;
if(a%2 == 1 && b%2 == 0) return 0;
return (a > b) ? 1 : 0;
}
/**
* 排序函数,由大到小排序
* 用到的compare函数因题而异
*/
void sort(int* a, int count){
for(int i = 0; i < count-1; i++){
for(int j = 0; j < count-1-i; j++){
//compare & swap
if(compare(a[j], a[j+1])){
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}
int main(){
int user;
scanf("%d", &user);
int u[100];
for(int i = 0; i < user; i++){
scanf("%d", &u[i]);
}
sort(u, user);
for(int i = user-1; i >= 0; i--){
printf("%d ", u[i]);
}
return 0;
}
38
#include <stdio.h>
int getSum(int num){
int r = 0;
while(num > 0){
r += num % 10;
num /= 10;
}
return r;
}
/**
* parse int Array from a number
* return the digits of that array
*
* tar= target
* num= number
*/
int parseArray(int num, int tar[]){
tar[0] = num;
int digits = 0;
for(int i = 0; i <= digits; i++){
if(tar[i] >= 10){
tar[i+1] = tar[i]/10;
tar[i] = tar[i]%10;
digits++;
}
}
}
int isOK(int num[], int count){
int flag = 1;
for(int i = 0; i <= count/2; i++){
if(num[i] != num[count-1-i]) flag = 0;
}
return flag;
}
int main(){
int user;
scanf("%d", &user);
int tar[10];
int count = parseArray(user, tar);
int flag = isOK(tar, count);
if(flag) printf("%d", getSum(user));
else printf("no");
}
39
#include <stdio.h>
#define MAXROW 100
#define MAXCOL 100
int main() {
int row, col;
scanf("%d%d", &row, &col);
int arr[MAXROW][MAXCOL];
for (int y = 0; y < row; y++) {
for (int x = 0; x < col; x++) {
scanf("%d", &arr[y][x]);
}
}
int isR = 0;
for (int y = 0; y < row; y++) {
int minColIndex = 0;
// 寻找当前行中最小元素所在的列索引
for (int x = 1; x < col; x++) {
if (arr[y][x] < arr[y][minColIndex]) {
minColIndex = x;
}
}
// 判断当前行最小元素是否也是其所在列的最大元素
int minValue = arr[y][minColIndex];
int isMaxInCol = 1;
for (int i = 0; i < row; i++) {
if (arr[i][minColIndex] > minValue) {
isMaxInCol = 0;
break;
}
}
if (isMaxInCol) {
isR = 1;
printf("%d %d %d\n", y, minColIndex, minValue);
}
}
if (isR == 0) printf("no\n");
return 0;
}
40
#include <stdio.h>
void sort(int* a, int count){
for(int i = 0; i < count-1; i ++){
for(int j = 0; j < count-1-i; j++){
if(a[j]>a[j+1]){
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}
int main(){
int user;
scanf("%d", &user);
int a[100];
for(int i = 0; i < user; i++){
scanf("%d", &a[i]);
}
sort(a, user);
int d = a[1] - a[0];
int hasD = 1;
for(int i = 2; i < user; i++){
if(d != a[i] - a[i-1]){
hasD = 0;
}
}
if(hasD) printf("%d", d);
else printf("no");
return 0;
}
41
/*
给出一组PM2.5数据,按以下分级标准统计各级天气的天数,并计算出PM2.5平均值。
PM2.5分级标准为:
一级优(0<=PM2.5<=50)
二级良(51<=PM2.5<=100为)
三级轻度污染(101<=PM2.5<=150)
四级中度污染(151<=PM2.5<=200)
五级重度污染(201<=PM2.5<=300)
六级严重污染(PM2.5>300)
输入说明
输入分为两行,
第一行是一个整数n表示天数(1<n<=100);
第二行为n个非负整数Pi(0<=Pi<=1000),表示每天的PM2.5值,整数之间用空格分隔。
输出说明
输出两行数据,
第一行为PM2.5平均值,结果保留2位小数;
第二行依次输出一级优,二级良,三级轻度污染,四级中度污染,五级重度污染,六级严重污染的天数。
*/
// Using Pointer, a little f**k out
#include <stdio.h>
#define LEVEL_1 50
#define LEVEL_2 100
#define LEVEL_3 150
#define LEVEL_4 200
#define LEVEL_5 300
int l1 = 0;
int l2 = 0;
int l3 = 0;
int l4 = 0;
int l5 = 0;
int l6 = 0;
int makeLevel(int value){
if(value <= LEVEL_1) l1++;
else if(value <= LEVEL_2) l2++;
else if(value <= LEVEL_3) l3++;
else if(value <= LEVEL_4) l4++;
else if(value <= LEVEL_5) l5++;
else l6++;
}
double average(int *a, int count){
int sum = 0;
for(int i = 0; i < count; i++){
sum += *a;
a++;
}
return (double)sum/count;
}
int main(){
int day[100];
int days;
scanf("%d", &days);
for(int i = 0; i < days; i++){
scanf("%d", &day[i]);
makeLevel(day[i]);
}
printf("%.2f\n", (double)average(&day[0], days));
printf("%d %d %d %d %d %d", l1, l2 ,l3 ,l4, l5 ,l6);
}
42
/*
标题
整除判断
类别
基本计算
时间限制
1S
内存限制
256Kb
问题描述
判断正整数a能否被b整数,如果不能整除,输出商和余数
输入说明
输入两个正整数a和b(0<a, b<=10000),a和b之间用空格分隔。
输出说明
如果a能被b整除,输出yes,否则在同一行输出a除以b的商和余数,商和余数之间用空格分隔
输入样例
17 7
输出样例
2 3
*/
#include <stdio.h>
int main(){
short int a,b;
scanf("%hd %hd", &a, &b);
if(a%b != 0){
printf("%d %d", a/b, a%b);
}else{
printf("yes");
}
}
43
/*
问题描述
给出一个整数n(0<=n<=100000000)。求出该整数的位数,以及组成该整数的所有数字中的最大数字和最小数字。
输入说明
输入一个整数n(0<=n<=100000000)
输出说明
在一行上依次输出整数n的位数,以及组成该整数的所有数字中的最大数字和最小数字,各个数字之间用空格分隔。
*/
#include <stdio.h>
int main(){
int user, temp, max, min;
int num[10]= {0,0,0,0,0,0,0,0,0,0};
int count = 0;
scanf("%d", &user);
temp = user;
int hasNext = 1;
while(hasNext){
if(temp != 0){
num[count] = temp % 10;
temp = temp/10;
count++;
}else{
hasNext = 0;
}
}
if(user == 0) count++;
max = num[0];
min = num[0];
for(int i = 0; i < count; i++){
if(max < num[i]) max = num[i];
if(min > num[i]) min = num[i];
}
printf("%d %d %d", count, max ,min);
}
/*
输入样例
217
输出样例
3 7 1
*/
44
#include <stdio.h>
int isPrime(int n){
int flag = (n == 1 ? 0 : 1);
for(int i = 2; i <= n/2; i++){
if(n%i == 0){
flag = 0;
break;
}
}
return flag;
}
int getFib(int index){
int r;
if(index == 1 || index == 2) r = 1;
else r = getFib(index-1) + getFib(index-2);
return r;
}
int main(){
int user;
scanf("%d", &user);
int a = getFib(user);
if(isPrime(a)) printf("yes");
else printf("%d", a);
}
45
46
#include <stdio.h>
#define MAXCOUNT 100
int trend(int* n){
return (*(n+1) - *n > 0) ? 1 : -1;
}
int main(){
int count = 0;
int user[MAXCOUNT];
int result = 0;
// init user[]
for(int i = 0; i <= MAXCOUNT; i++){
user[i] = 0;
}
// input user
scanf("%d", &count);
for(int i = 0; i < count; i++){
scanf("%d", &user[i]);
}
// get
for(int i = 1; i < count-1; i++){
if(trend(&user[i-1]) != trend(&user[i])) result++;
}
printf("%d", result);
}
47
/*
标题
冰箱温度预测
类别
基本计算
时间限制
1S
内存限制
256Kb
问题描述
编写一个程序,用于预测冰箱断电后经过时间t(以小时为单位)后的温度T。已知计算公式如下所示
输入说明
输入两个整数h和m表示冰箱断电后经过的时间,h表示小时,m表示分钟
输出说明
输出冰箱断电后经过时间t(以小时为单位)后的温度T,保留两位小数
输入样例
2 0
输出样例
-16.00
*/
#include <stdio.h>
int main(){
int h, m;
double e;
scanf("%d %d", &h, &m);
e = h + m/60.0;
printf("%.2f", 4.0*e*e/(e+2)-20);
return 0;
}
48
/*
标题
除法计算器
类别
基本计算
时间限制
1S
内存限制
256Kb
问题描述
小明的弟弟刚开始学习除法,为了检查弟弟的计算结果是否正确,小明决定设计一个简单计算器程序来验算。
输入说明
输入数据由四个整数m,n,q,r构成,m为被除数,n为除数,q和r为小明的弟弟计算出的商和余数。整数之间用空格分隔,所有整数取值范围在(-100000~100000),n不为0。
输出说明
如果验算结果正确,输出yes,否则输出正确的商和余数
输入样例
输入样例:
样例1:
10 3 3 1
样例2:
10 3 3 2
输出样例
样例1输出:
yes
样例2输出:
3 1
*/
#include <stdio.h>
int main(){
int m, n, a, b;
scanf("%d %d", &m ,&n);
int q = m/n;
int r = m % n;
scanf("%d %d", &a, &b);
if(a != q | b !=r){
printf("%d %d", q, r);
}else{
printf("yes");
}
}
49
#include <stdio.h>
int main(){
int user, root;
int hasRoot = 0;
scanf("%d", &user);
for(int i = 0; i <= user; i++){
if(i*i == user){
hasRoot = 1;
root = i;
}
if(hasRoot) break;
}
if(hasRoot) printf("%d", root);
else printf("no");
}
50
/*
问题描述
小明决定申请一个新的QQ号码,系统随机生成了若干个号码供他选择。小明的选号原则是:
1. 选择所有号码中各位数字之和最大的号码。
2. 如果有多个号码各位数字之和相同则选择数值最大的号码。
请你写一个程序帮助小明选择一个QQ号码。
输入说明
输入数据由两行构成,
第一行为一个整数n表示有n个待选号码(0<n<100),
第二行有n个正整数,表示各个待选的号码,
每个号码长度不超过9位数。
每个号码之间用空格分隔,且每个号码都不相同。
输出说明
输出根据小明的选号原则选出的号码。
*/
#include <stdio.h>
int sum(int num){
int s = 0;
while(num > 0){
s = s + num%10;
num = num/10;
}
return s;
}
int main(){
int user[100];
int maxSum = 0, maxNumber = 0;
int count;
scanf("%d", &count);
for(int i = 0; i < count; i++){
scanf("%d", &user[i]);
}
for(int i = 0; i < count; i++){
int temp = sum(user[i]);
if(temp > maxSum || (temp == maxSum && maxNumber == user[i])){
maxSum = temp;
maxNumber = user[i];
}
}
printf("%d\n", maxNumber);
}
51
/*
问题描述
从键盘输入四个整数,找出其中的最大值并将其输出。
输入说明
输入4个整数,用空格分隔
输出说明
输出值最大的一个整数
*/
#include <stdio.h>
#define COUNT 4
int main(){
int user[COUNT];
for(int i = 0; i < COUNT; i++){
scanf("%d", &user[i]);
}
int max = user[0];
for(int i = 1; i < COUNT; i++){
if(user[i] > max){
max = user[i];
}
}
printf("%d", max);
}
52
/*
问题描述
从键盘输入一个字符,若为小写字母,则输出其对应的大写字母;若为大写字母,则输出对应的小写字母;其他字符原样输出。
输入说明
输入一个字符
输出说明
输出一个字符
*/
#include <stdio.h>
int main(){
char user;
scanf("%c", &user);
if('a' <= user && user <= 'z') user = user - 32;
if('A' <= user && user <= 'Z') user = user + 32;
printf("%c", user);
}
53
/*
问题描述
给出一个百分制的成绩,要求输出成绩等级'A','B','C','D','E'。90分以上为'A',80~89分为'B',70~79分为'C',60~69分为'D',60分以下为'E'。
输入说明
输入一个正整数m(0<=m<=100)
输出说明
输出一个字符
*/
#include <stdio.h>
int main(){
const char LEVELS[11] = {'A' ,'A', 'B', 'C', 'D', 'E', 'E', 'E', 'E', 'E', 'E'};
int score;
scanf("%d", &score);
int index = 10 - score/10;
printf("%c", LEVELS[index]);
}
54
/*问题描述
已知abc+cba=n,其中a,b,c均为一位数,1000<n<2000,编程求出满足条件的a,b,c所有组合。
输入说明
一个整数n
输出说明
按照整数abc从小到大的顺序,输出a, b, c, 用空格分隔,每输出一组a,b,c后换行.*/
#include <stdio.h>
int main(){
int n, a, b, c;
scanf("%d", &n);
for(a = 0; a <= 9; a++){
for(b = 0; b <= 9; b++){
for(c = 1; c <=9; c++){
int left = a*101 + b*20 + c*101;
if(left == n){
printf("%d %d %d\n", a ,b, c);
}
}
}
}
}
55
#include <stdio.h>
#define A1 2
#define A2 3
#define B1 1
#define B2 2
int getA(int index){
if(index == 1) return A1;
else if(index == 2) return A2;
else return getA(index-1) + getA(index-2);
}
int getB(int index){
if(index == 1) return B1;
else if(index == 2) return B2;
else return getB(index-1) + getB(index-2);
}
int main(){
int user;
scanf("%d", &user);
double r = 0;
for(int i = 1; i <= user; i++){
// printf("GET: %d %d\n", getA(i), getB(i));
r += (double)getA(i)/getB(i);
}
printf("%.2f", r);
}
56
/*
问题描述
设直角三角形两条直角边长度为a和b,斜边长度为c,则a,b,c满足a^2+b^2=c^2,
输入三个整数a,b,c,判断对应的三角形是不是直角三角形,不是则输出“no”,是则输出其面积的2倍。
输入说明
数据由同一行的三个整数a,b,c构成,整数之间以空格分隔
输出说明
如果输入的三个整数可以构成一个直角三角形,则输出一个整数表示该三角形面积的2倍;否则输出“no”
*/
#include <stdio.h>
int main(){
int a, b, c;
int index;
int area = 0;
scanf("%d %d %d", &a, &b, &c);
if(a*a + b*b == c*c){
area = a*b;
}
if(a*a + c*c == b*b){
area = a*c;
}
if(b*b + c*c == a*a){
area = b*c;
}
if(area) printf("%d", area);
else printf("no");
}
57
#include <stdio.h>
int fib(int index){
if(index == 0) return 7;
else if(index == 1) return 11;
else return fib(index-1) + fib(index-2);
}
int main(){
int user;
scanf("%d", &user);
int r = fib(user);
printf("%d", r);
}
64
/*
编程实现:输入一自然数 n,求组成 n^3 的 n 个连续奇数。
输入说明
一个正整数 n,0<n<30。
输出说明
输出 n 个连续奇数,数据之间用空格隔开,并换行
*/
/**
* 观察发现,如果用户输入n
* 在分解的时候,第一位数字总是: n*n - n + 1
*/
#include <stdio.h>
int main(){
int num;
scanf("%d", &num);
int first = num*num - num + 1;
for(int i = 0; i < num; i++){
int now = first + i*2;
printf("%d", now);
if(i != num-1) printf(" ");
}
}
65
#include <stdio.h>
int getSum(int num){
int r = 0;
while(num>0){
r += num % 10;
num /= 10;
}
return r;
}
int main(){
int user;
scanf("%d", &user);
while(user >= 10){
user = getSum(user);
}
printf("%d", user);
}
67
#include <stdio.h>
int main(){
int user;
scanf("%d", &user);
int tar;
scanf("%d", &tar);
int a[100];
for(int i = 0; i < user; i++){
scanf("%d", &a[i]);
}
/**
* compare & record
*/
int indexs[100] = {0, };
for(int i = 0; i < user; i++){
if(a[i] == tar){
indexs[0]++;
indexs[indexs[0]] = i;
}
}
/**
* make result
*/
for(int i = 1; i <= indexs[0]; i++){
printf("%d ", indexs[i]);
}
if(indexs[0] == 0) printf("-1");
return 0;
}
68
/*
问题描述
给定一个年份y和一个整数d,问这一年的第d天是几月几日?
注意闰年的2月有29天,且满足下面条件之一的是闰年:
1) 年份是4的整数倍,而且不是100的整数倍;
2) 年份是400的整数倍
输入说明
输入包含两个整数y和d,y表示年份,年份在1900到2018之间(包含1900和2018)。 d表示这一年的第几天,d在1至365之间。
输出说明
在一行输出两个整数,分别表示答案的月份和日期。
*/
#include <stdio.h>
int isLeapYear(int year){
return (
(year%400 == 0) || (year%4 == 0 && year%100 != 0));
}
int main(){
int year, index;
scanf("%d %d", &year, &index);
int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int remain = index -1;
int month = 1, day = 1;
if(isLeapYear(year)) days[2] = 29;
for(int i = 1; i <= 12; i++){
if(remain < days[i]){
day = remain + 1;
break;
}
month++;
remain = remain - days[i];
}
printf("%d %d", month, day);
}
69
#include <stdio.h>
#define MAXROW 100
#define MAXCOL 100
int main(){
int row, col;
scanf("%d%d", &row, &col);
int arr[MAXROW][MAXCOL];
for(int y = 0; y < row; y++){
for(int x = 0; x < col; x++){
scanf("%d", &arr[y][x]);
}
}
int start, end;
int len = 0;
for(int y = 0; y < row; y++){
start = -1;
end = -1;
for(int x = 0; x < col; x++){
//检查到x处为1的时候,进入计数
if(arr[y][x] == 1){
//计数初始化
int s = x;
int e = x;
x++;
//开始计数
while(arr[y][x] == 1){
e++;
x++;
}
//本次长度与上一次比较
if(e - s >= end - start){
start = s;
end = e;
}
}
}
printf("%d %d\n", start, end);
}
}
71
#include <stdio.h>
#define MAXCOL 22
#define MAXROW 22
int map[50] = {0};
int isMapped(int n);
void addMap(int n);
int getMapCount(int);
int main(){
extern int map[];
int row, col;
scanf("%d%d", &row, &col);
int key, areas;
scanf("%d%d", &areas, &key);
int a[MAXCOL][MAXROW] = {0};
for(int y = 1; y <= row; y++){
for(int x = 1; x <= col; x++){
scanf("%d", &a[y][x]);
}
}
int keyX[] = { 0, 1, 0, -1};
int keyY[] = {-1, 0, 1, 0};
for(int y = 1; y <= row; y++){
for(int x = 1; x <= col; x++){
if(a[y][x] == key){
for(int i = 0; i < 4; i++){
int num = a[y + keyY[i]][x + keyX[i]];
if(isMapped(num) == 0){
addMap(num);
}
}
}
}
}
printf("%d", getMapCount(key));
}
//关于以下函数均从map[1]开始遍历的原因:map[0]必定为0
int isMapped(int n){
for(int i = 1; map[i] != 0; i++){
if(map[i] == n) return 1;
}
return 0;
}
void addMap(int n){
int i = 1;
while(map[i] != 0){
i++;
}
map[i] = n;
}
int getMapCount(int ignoredNum){
//map[]的第一位一定是0
int count = 0;
for(int i = 1; map[i] != 0; i++){
if(map[i] != ignoredNum){
count++;
}
}
return count;
}
73
#include <stdio.h>
#include <string.h>//库函数真好用
#include <ctype.h>
void decompress(const char com[]) {
int len = strlen(com);
char decompressed[100] = "";
int index = -1;
int mark = 0;
while(mark < len){
if(isalpha(com[mark])){
int repeat;
char alpha = com[mark];
//digit after the alpha
if(isdigit(com[mark+1])){
//two digits after the alpha
if(isdigit(com[mark+2])){
repeat = (com[mark+1] - '0')*10 + com[mark+2] - '0';
mark += 3;
}else{//one digit after the alpha
repeat = com[mark+1] - '0';
mark += 2;
}
}else{//alpha after the alpha
repeat = 1;
mark += 1;
}
//append to decompressed
for(int j = 0; j < repeat; j++){
index++;
decompressed[index] = alpha;
}
}else if(com[mark] == '\0'){
break;
}else{
printf("Internal Error!\n");
break;
}
}
printf("%s\n", decompressed);
}
int main() {
char compressed[51];
scanf("%s", compressed);
decompress(compressed);
return 0;
}
74
#include <stdio.h>
/**
* mode:
* -1 - Left
* 1 - Right
* 0 - L&R
*/
int check(char ch, int mode){
if(mode == 0){
if(ch == '[' || ch == '(' || ch == '{') return 1;
if(ch == ']' || ch == ')' || ch == '}') return 1;
}
if(mode == -1){
if(ch == '[' || ch == '(' || ch == '{') return 1;
}
if(mode == 1){
if(ch == ']' || ch == ')' || ch == '}') return 1;
}
return 0;
}
int isCouple(char a, char b){
if(a == '[' && b == ']') return 1;
if(a == '(' && b == ')') return 1;
if(a == '{' && b == '}') return 1;
return 0;
}
int main(){
char user[50] = "";
scanf("%[^\n]", user);
int len = 0;
while(user[len] != '\0') len++;
int isLegal = 1;
char list[50] = "";
int index = -1;
//用队列的方法,先遍历,储存或删去队列末项
for(int i = 0; i < len; i++){
if(check(user[i], -1)){
index++;
list[index] = user[i];
}else if(check(user[i], 1) && isCouple(list[index], user[i])){
list[index] = '\0';
index--;
}
}
printf("%s", index == -1 ? "yes" : "no");
}
76
#include <stdio.h>
void sort(int* a, int count){
for(int i = 0; i < count; i++){
for(int j = 0; j < count-1-i; j++){
if(a[j]>a[j+1]){
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}
int main(){
int user;
scanf("%d", &user);
int a[100];
for(int i = 0; i < user; i++){
scanf("%d", &a[i]);
}
sort(a, user);
int count = 1;
for(int i = 0; i < user; i++){
if(a[i] == a[i+1]) count++;
else{
printf("%d:%d\n", a[i], count);
count = 1;
}
}
return 0;
}
77
#include <stdio.h>
int calc(int n1, int n2, char op){
if(op == '+') return n1+n2;
if(op == '-') return n1-n2;
if(op == '*') return n1*n2;
if(op == '/') return n1/n2;
if(op == '%') return n1%n2;
}
int main(){
int n1 = 0, n2 = 0;
char op;
char user[20] = "";
scanf("%[^\n]", user);
int len = 0, index_end;
while(user[len] != '\0') len++;
index_end = len-1;
//穷举算法!
int index_space_1 = 0, index_space_2 = 0;
int index_op = 0;
for(int i = 0; i < len; i++){
if(index_space_1 == 0 && user[i] == ' ') index_space_1 = i;
else if(index_space_2 == 0 && user[i] == ' ') index_space_2 = i;
if(user[i] != ' ' && (user[i] < '0' || user[i] > '9')){
op = user[i];
index_op = i;
}
}
int index_n1_start, index_n1_end;
int index_n2_start, index_n2_end;
if(index_op < index_space_1){
index_n1_start = index_space_1+1;
index_n1_end = index_space_2-1;
index_n2_start = index_space_2+1;
index_n2_end = index_end;
}else if(index_op > index_space_2){
index_n1_start = 0;
index_n1_end = index_space_1-1;
index_n2_start = index_space_1+1;
index_n2_end = index_space_2-1;
}else{
index_n1_start = 0;
index_n1_end = index_space_1-1;
index_n2_start = index_space_2+1;
index_n2_end = index_end;
}
for(int i = index_n1_start; i <= index_n1_end; i++){
n1 = n1*10 + user[i] - 48;
}
for(int i = index_n2_start; i <= index_n2_end; i++){
n2 = n2*10 + user[i] - 48;
}
/* if(s1 == 0) result = calc(b,c,a);
else if(s2 == 0) result = calc(a,c,b);
else if(s3 == 0) result = calc(a,b,c);
else printf("Internal Error!\n"); */
printf("%d", calc(n1, n2, op));
}
78
#include <stdio.h>
char map[21][21];
int visited[21][21] = {0};
int cols, rows;
int x, y;
int hasLoop;
/**
* return 1 : OK
* return 0 : LOOP
*/
int move();
int main(){
y = 1;
hasLoop = 0;
scanf("%d %d %d", &rows, &cols, &x);
getchar();
for(int r = 1; r <= rows; r++){
for(int c = 1; c <= cols; c++){
map[r][c] = getchar();
}
getchar();
}
int steps = 0;
while (move()){
steps++;
}
if(hasLoop == 1){
printf("loop %d", steps);
}else{
printf("out %d", steps);
}
}
int move(){
if(x == 0 || x > cols || y == 0 || y > rows){
return 0;
}
if(visited[y][x] == 1){
hasLoop = 1;
return 0;
}
switch (map[y][x]){
case 'W':
visited[y][x] = 1;
x--;
return 1;
case 'E':
visited[y][x] = 1;
x++;
return 1;
case 'N':
visited[y][x] = 1;
y--;
return 1;
case 'S':
visited[y][x] = 1;
y++;
return 1;
}
return 0;
}
79
/*
题目描述:计算三个整数的平均值,结果保留两位小数。
输入格式:共一行,包含三个整数,整数之间用空格分隔。
输出格式:共一行,输出平均值,结果保留两位小数。
输入示例:20 42 55
输出示例:39.00
*/
#include <stdio.h>
int main(){
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
printf("%.2f",((double)a+b+c)/3);
}
80
#include <stdio.h>
/**
* mode:
* 1 -> A != a
* 0 -> A == a
*/
int check(char a, char b, int mode){
if(a == b) return 1;
if(mode == 0){
if(a - b == 32 || b - a == 32) return 1;
else return 0;
}
return 0;
}
int main(){
char tar;
int mode;
scanf("%c %d\n", &tar, &mode);
char user[64];
scanf("%[^\n]", user);
int count = 0;
for(int i = 0; user[i] != '\0'; i++){
if(check(tar, user[i], mode)) count++;
}
printf("%d", count);
}
81
#include <stdio.h>
#include <ctype.h>//不想手搓判断字母的函数了,就用库文件吧!
#include <string.h>
void toLowerStr(char *str){
for(int i = 0; str[i] != '\0'; i++) str[i] = tolower(str[i]);
}
int isContain(char str[], char tar[]){
int lenStr = strlen(str);
int lenTar = strlen(tar);
for (int i = 0; i <= lenStr - lenTar; i++) {
int j;
for (j = 0; j < lenTar; ++j) {
if (str[i + j] != tar[j]) {
break;
}
}
if (j == lenTar) {
return 1; // 找到了匹配的子字符串
}
}
return 0; // 没有找到匹配的子字符串
}
int main(){
/* char test[10] = "aHellow!";
char testTar[10] = "Hello";
printf("%d", isContain(test, testTar)); */
char tar[100] = "";
int mode, ln;
char user[10][100] = {""};
char temp_user[10][100] = {""};
char temp_tar[100] = "";
scanf("%s", tar);
scanf("%d\n%d", &mode, &ln);
for(int i = 0; i < ln; i++){
scanf("%s", user[i]);
}
//录入缓存
for(int y = 0; y < 10; y++){
for(int x = 0; x < 100; x++){
temp_user[y][x] = user[y][x];
}
}
for(int i = 0; i < 100; i++) temp_tar[i] = tar[i];
if(mode == 0){
for(int i = 0; i < ln; i++){
toLowerStr(temp_user[i]);
}
toLowerStr(temp_tar);
}
printf("\n");
for(int i = 0; i < ln; i++){
if(isContain(temp_user[i], temp_tar)) printf("%s\n", user[i]);
}
}
82
#include <stdio.h>
int main(){
char pw[51];
//这题的测试用例里有空格存在,所以用fgets
fgets(pw, 50, stdin);
int len = 0;
while(pw[len] != '\n') len++;
int score = 0;
//#1
if(len != 0) score++;
//#2
if(len > 8) score++;
//#3
int hasDigit = 0, hasAlphaH = 0,hasAlphaL = 0, hasSymbol = 0;
for(int i = 0; i < len; i++){
char c = pw[i];
if(c >= '0' && c <= '9') hasDigit = 1;
else if(c >= 'A' && c <= 'Z') hasAlphaH = 1;
else if(c >= 'a' && c <= 'z') hasAlphaL = 1;
else hasSymbol = 1;
}
int index = hasDigit + hasAlphaH + hasAlphaL + hasSymbol;
if(index == 2) score += 1;
else if(index == 3) score += 2;
else if(index == 4) score += 3;
printf("%d", score);
}
83
//AI
/*
问题描述
旋转是图像处理的基本操作,在这个问题中,你需要将一个图像顺时针旋转90度。
计算机中的图像可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可。例如,下面的矩阵(a)表示原始图像,矩阵(b)表示顺时针旋转90度后的图像。
输入说明
输入的第一行包含两个整数n和m,分别表示图像矩阵的行数和列数。1 ≤ n, m ≤ 100。
接下来n行,每行包含m个非负整数,表示输入的图像,整数之间用空格分隔。
输出说明
输出m行,每行n个整数,表示顺时针旋转90度之后的矩阵,元素之间用空格分隔。
输入样例
2 3
1 5 3
3 2 4
输出样例
3 1
2 5
4 3
*/
#include <stdio.h>
#define MAX 100
int main() {
int n, m;
int image[MAX][MAX];
int rotated[MAX][MAX];
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
scanf("%d", &image[i][j]);
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
rotated[j][n - i - 1] = image[i][j];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
printf("%d ", rotated[i][j]);
}
printf("\n");
}
return 0;
}
84
/**
* Description: Stimulation of Linux 'cd' command
*
* Author: flew_kites
* University: Xidian University
* Date: 2024/1/11
* Source: xdoj-T84
*
* ---Usages---
* In the first input, you should input the initial directory.
* Then you can execute cd command.
* Type 'pwd' to print current directory and terminate the program.
*
* Command pwd: print current directory
* - pwd: print current directory
*
* Command cd: change directory
* - cd dir1/dir2: go to relative path
* - cd /path/to/dir: go to absolute path
* - cd /: go to root directory
* - cd ..: go to parent directory
* ---/Usages---
*
* ---Example---
* (FULL_MODE = 0)
* Input1: /d2/d3/d7
* Input2: cd ..
* Input3: cd /
* Input4: cd /d1/d6
* Input5: cd d4/d5
* Input6: pwd
*
* Output: /d1/d6/d4/d5
* (Program terminated due to FULL_MODE = 0)
* ---/Example---
*
* ---Full Mode---
* If you want to use this program in full mode, you can define FULL_MODE as 1.
* In full mode, the program will work more like a Linux shell.
* For example:
* - You can see the username and hostname in the prompt, default is 'kites@Linux'
* - You can type 'pwd' to print current directory and continue to input.
* ---/Full Mode---
*/
#define FULL_MODE 1
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
void pwd(bool has_newline);
void cd(char *path);
char dir[100][100];
int dir_num = 0;
int main(){
char user[100] = "";
char initDir[100] = "/";
char* command_pwd = "pwd";
char* command_cd = "cd";
scanf("%s", initDir);
cd(initDir);
getchar();
while(1){
if(FULL_MODE){
printf("kites@Linux:");
pwd(false);
printf("$ ");
}
scanf("%[^\n]", user);
getchar();
if(strncmp(user, command_pwd, 3) == 0){
pwd(true);
if(!FULL_MODE) break;
}else if(strncmp(user, command_cd, 2) == 0){
cd(user + 3);
}else{
printf("Invalid command!\n");
}
}
return 0;
}
void pwd(bool has_newline){
if(dir_num == 0){
printf("/");
}else{
for(int i = 0; i < dir_num; i++){
printf("/%s", dir[i]);
}
}
if(has_newline){
printf("\n");
}
}
void cd(char *path){
if(strncmp(path, "..", 2) == 0){
if(dir_num != 0){
dir_num--;
}
return;
}
if(strncmp(path, "/", 1) == 0){
dir_num = 0;
path++;
}
char* token = strtok(path, "/");
while(token != NULL){
strcpy(dir[dir_num++], token);
token = strtok(NULL, "/");
}
}
85
#include <stdio.h>
#include <string.h>
void toLowerStr(char*);
double getSimilarityRate(char*, char*);
int main(){
char s1[100];
char s2[100];
scanf("%[^\n]", s1);
getchar();
scanf("%[^\n]", s2);
getchar();
toLowerStr(s1);
toLowerStr(s2);
double rate = getSimilarityRate(s1, s2);
printf("%.3f", rate);
}
/**
* 将str中的所有大写字母转换为小写
*/
void toLowerStr(char* str){
for(int i = 0; str[i] != '\0'; i++){
if(str[i] >= 'A' && str[i] <= 'Z'){
//把作为大写字母的str[i]变成小写;
str[i] = str[i] + 32;
}
}
}
/**
* 计算相似度
* 步骤:先求出相似字符个数,再按题意计算相似度
*
* 求相似字符个数的思路:
* - 遍历s1,每次从s1取一个字符与s2相比,若在s2中找到了相同的字符,进入比较模式
* - 比较模式:发现s1[i]这个字符在s2中能找到,且s1[i] == s2[j],则
* - - 怀疑s1[i]及其之后是两个字符串的共有字符串
* - - 从s1[i]入手,比较s1[i+1]和s2[j+1],若相等,给计数器temp++,进一步比较下一位
* - - 直到发现不相等,此时记录的temp即为本轮比较模式得到的相同字符串长度
* - - 注意:考虑比较字符串的时候不止一次进入比较模式,则退出比较模式之前,需要取较大值
*/
double getSimilarityRate(char *s1, char* s2){
int sharedChars = 0;
for(int i = 0; i < strlen(s1); i++){
for(int j = 0; j < strlen(s2); j++){
//发现有相同字母,进入比较模式
if(s1[i] == s2[j]){
//先初始化变量
int temp = 0;
int i1 = i;
int i2 = j;
//循环,在不超过各字符串长度的前提下,依次往后比较相同字母
while(i1 < strlen(s1) && i2 < strlen(s2)){
if(s1[i1] == s2[i2]){
temp++;
i1++;
i2++;
}else{
break;
}
}
//取较大值
if(temp > sharedChars) sharedChars = temp;
}
}
}
return 2.0*sharedChars/(strlen(s1) + strlen(s2));
}
86
//AI
/*
问题描述
在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形,指将横坐标范围从x1到x2,纵坐标范围从y1到y2之间的区域涂上颜色。
如一个画了两个矩形的例子。第一个矩形是(1,1) 到(4, 4),用绿色和紫色表示。第二个矩形是(2, 3)到(6, 5),用蓝色和紫色表示。图中,一共有15个单位的面积被涂上颜色,其中紫色部分被涂了两次,但在计算面积时只计算一次。在实际的涂色过程中,所有的矩形 都涂成统一的颜色,图中显示不同颜色仅为说明方便。给出所有要画的矩形,请问总共有多少个单位的面积被涂上颜色。
输入说明
输入的第一行包含一个整数n,表示要画的矩形的个数,1<=n<=100
接下来n行,每行4个非负整数,分别表示要画的矩形的左下角的横坐标与纵坐标,以及右上角的横坐标与纵坐标。0<=横坐标、纵坐标<=100。
输出说明
输出一个整数,表示有多少个单位的面积被涂上颜色。
输入样例
2
1 1 4 4
2 3 6 5
输出样例
15
*/
#include <stdio.h>
#include <string.h>
#define MAX 101
int paper[MAX][MAX];
int main() {
int n;
scanf("%d", &n);
memset(paper, 0, sizeof(paper));
for (int i = 0; i < n; i++) {
int x1, y1, x2, y2;
scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
for (int x = x1; x < x2; x++)
for (int y = y1; y < y2; y++)
paper[x][y] = 1;
}
int count = 0;
for (int x = 0; x < MAX; x++)
for (int y = 0; y < MAX; y++)
if (paper[x][y]) count++;
printf("%d\n", count);
return 0;
}
87
/*
问题描述
跳一跳是一款微信小游戏,游戏规则非常简单,只需玩家要从一个方块跳到下一个方块,如果未能成功跳到下一个方块则游戏结束。
计分规则如下:
1. 如果成功跳到下一个方块上,但未跳到方块中心,加1分
2. 如果成功跳到下一个方块上,且刚好跳到方块中心,则第一次加2分,此后连续跳到中心时每次递增2分。
也就是说,第一次跳到方块中心加2分,连续第二次跳到方块中心加4分,连续第三次跳到方块中心加6分,…,以此类推。
3. 如果未能成功跳到方块上,加0分,且游戏结束
现在给出玩家一局游戏的每次跳跃情况,请计算玩家最终得分。
输入说明
输入为若干个非零整数(整数个数小于1000),表示玩家每次的跳跃情况。整数之间用空格分隔,整数取值为0,1,2。
0 表示未能成功跳到下一个方块上,
1 表示成功跳到下一个方块上但未跳到方块中心,
2 表示成功跳到下一个方块上,且刚好跳到方块中心。
输入的数据只有最后一个整数是0,其余均非零。
输出说明
输出一个整数表示该玩家的最终得分。
*/
#include <stdio.h>
int main(){
int isContinue = 1;
int score = 0, amp = 1;
int state;
while(isContinue){
scanf("%d", &state);
switch (state){
case 1:
score += 1;
amp = 1;
break;
case 2:
score += amp * 2;
amp++;
break;
case 0:
isContinue = 0;
break;
}
}
printf("%d", score);
}
88
#include <stdio.h>
#include <string.h>
int main(){
char ISBN[10];
scanf("%c-%c%c%c-%c%c%c%c%c-%c",
&ISBN[0], &ISBN[1], &ISBN[2], &ISBN[3], &ISBN[4],
&ISBN[5], &ISBN[6], &ISBN[7], &ISBN[8], &ISBN[9]);
int sum = 0;
for(int i = 0; i < 9; i++){
sum += (i + 1) * (ISBN[i] - '0');
}
char sign;
int check = sum%11;
if(check == 10){
sign = 'X';
}else{
sign = check + '0';
}
if(sign == ISBN[9]){
printf("Right");
}else{
printf("%c-%c%c%c-%c%c%c%c%c-%c",
ISBN[0], ISBN[1], ISBN[2], ISBN[3], ISBN[4],
ISBN[5], ISBN[6], ISBN[7], ISBN[8], sign);
}
}
89
/*
题目描述:输入球的半径,计算并输出球的体积,假定pi=3.14,结果保留两位小数。
输入格式:共一行,输入球体半径,两位小数。
输出格式:共一行,输出球体体积,结果保留两位小数。
示例:
输入:5.50
输出:696.56
*/
#include <stdio.h>
#define PI 3.14
int main(){
double r;
scanf("%lf", &r);
printf("%.2f", 4.0/3.0*PI*r*r*r);
}
90
/*
题目描述:输入一个三位数整数,求其百位、十位和个位数字之和。
输入格式:共一行,输入一个三位整数。
输出格式:共一行,输出一个整数。
示例:
输入:128
输出:11
*/
#include <stdio.h>
int main(){
char a, b, c;
scanf("%c%c%c", &a, &b, &c);
printf("%d", a+b+c-144);
}
91
/*
题目描述:输入三角形的三边长,计算三角形的面积,结果保留两位小数。
边长分别为a,b,c,三角形的面积公式为s=sqrt(p(p-a)(p-b)(p-c)),其中p=(a+b+c)/2。
输入格式:共一行,输入三个数,保留两位小数,用空格隔开各个数据。
输出格式:共一行,输出面积,结果保留两位小数。
示例:
输入:3.00 4.00 5.00
输出:6.00
*/
#include <stdio.h>
#include <math.h>
int main(){
float a,b,c;
scanf("%f%f%f", &a, &b, &c);
float p = (a+b+c)*0.5;
printf("%.2f", sqrt(p*(p-a)*(p-b)*(p-c)));
}
92
/*
题目描述:公司财务要发工资现金,需要提前换取100元、50元、20元、10元、5元和1元的人民币,
请输入工资数,计算张数最少情况下,各自需要多少张。
输入格式:共一行,输入一个正整数。
输出格式:共一行,分别是100、50、20、10、5、1元面额的张数,用空格隔开各个数据。
示例:
输入:1258
输出:12 1 0 0 1 3
*/
#include<stdio.h>
int main(){
short int salary, hundred, fifty, twenty, ten, five, one;
scanf("%hd", &salary);
hundred = salary / 100;
salary = salary % 100;
fifty = salary / 50;
salary = salary % 50;
twenty = salary / 20;
salary = salary % 20;
ten = salary / 10;
salary = salary % 10;
five = salary / 5;
one = salary % 5;
printf("%d %d %d %d %d %d\n", hundred, fifty, twenty, ten, five, one);
}
98
/*
简单程序
问题描述
按输入 n 的不同情况,输出不同的特定文字。当 n 为 2 的倍数,且不是 3、5 的倍数时,
输出"Nice";当 n 为 3 的倍数,且不是 2、5 的倍数时,输出"Good";当 n 为 5 的倍数,且
不是 2、3 的倍数时,输出"Best";其他情况,输出"Bad"。
输入格式
输入一个正整数 n(n 为自然数,且 n≤10,000)。
输出格式
输出特定文字。
样例输入 1:
9
样例输入 2:
16
样例输入 3:
130
样例输出 1:
Good
样例输出 2:
Nice
样例输出 3:
Bad
样例说明
n 为自然数,且不大于 10,000。
评测用例规模与约定
n 可以是 2、3、5 的整数倍,也可以不是。
*/
#include <stdio.h>
int main(){
int n;
scanf("%d", &n);
if(n%2==0 && n%3 && n%5){
printf("Nice");
} else if (n%2 && n%3==0 && n%5){
printf("Good");
} else if (n%2 && n%3 && n%5==0){
printf("Best");
} else {
printf("Bad");
}
}
108
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int isPrime(int n){
if(n == 1) return 0;
for(int i = 2; i <= n/2; i++){
if(n%i == 0){
return 0;
}
}
return 1;
}
int getMaxFactor(int n){
if(isPrime(n)) return n;
for(int i = n - 1; i > 1; i--){
if(n % i == 0){
return i;
}
}
return 1;
}
int main(){
char str[100];
scanf("%[^\n]", str);
int lenS = strlen(str);
char result[100];
int lenR = 0;
for(int i = 0; i < lenS; i++){
if(isdigit(str[i])){
result[lenR++] = str[i];
}
}
result[lenR] = '\0';
int num = 0;
for(int i = 0; i < lenR; i++){
num = num * 10 + (result[i] - '0');
}
if(getMaxFactor(num) == 1) printf("0");
else printf("%d", getMaxFactor(num));
}
109
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int cmp(const void* a, const void* b){
return *(char*)a - *(char*)b;
}
int main(){
char s1[100], s2[100];
int len1 = 0, len2 = 0;
char str[100];
scanf("%s", str);
int len = strlen(str);
for(int i = 1; i < len; i++){
if(str[i] > str[0]){
s1[len1++] = str[i];
}else{
s2[len2++] = str[i];
}
}
s1[len1] = '\0';
s2[len2] = '\0';
qsort(s2, len2, sizeof(char), cmp);
printf("%s%c%s\n", s1, str[0], s2);
}
110
/**
* 出题人的锅,在线检测系统检测中文有漏洞
*
* 需要自己在本地把.c文件改成ANSI编码
*/
#include <stdio.h>
int main(){
short int n;
scanf("%hd", &n);
printf("%s\n", n%2==0?"是":"否");
}
111
/*
题目描述:编写程序,输入一个正整数,判断是否能被5和7同时整除,若可以,则输出yes;否则输出no。
输入格式:输入一个正整数。
输出格式:输出“yes”或“no”。
示例:
输入:35
输出:yes
*/
#include <stdio.h>
int main(){
short int n;
scanf("%d", &n);
printf("%s", (n%5==0 && n%7==0) ? "yes" : "no");
}
112
#include <stdio.h>
#include <math.h>
int main(){
double user;
scanf("%lf", &user);
double result;
if(user >= 0){
result = sqrt(user);
}else{
result = (user+1)*(user+1) + 2.0*user + 1.0/user;
}
printf("%.2f", result);
}
113
/*
题目描述:
编写程序,根据某城市普通出租车收费标准进行车费计算。标准如下:
起步里程为3公里,起步费10元;
超出起步里程后10公里内,每公理2元;
超过10公里以上的部分加收50%的回空补贴费,即每公里3元;
营运过程中,因路阻及乘客要求临时停车等待的,按每5分钟2元计费(不足5分钟不收费)。
输入格式:共一行,包括行驶里程(单位为公里,精确到小数点后1位)与等待时间(整数,单位为分钟),其间以空格分隔
输出格式:在一行中输出乘客应支付的车费(单位为元),结果四舍五入保留整数。
示例:
输入:40.0 7
输出: 116
*/
#include <stdio.h>
int main(){
double a, b, e=10;
scanf("%lf%lf", &a, &b);
if(a>3){
e += (a>=10) ? 14 : 2*(a-3);
if(a>10){
e += 3*(a-10);
}
}
if(b>=5){
e += 2*(int)(b/5);
}
printf("%.0lf", e);
}
125
/*
题目:利率计算
时间限制:1S
内存限制:10000Kb
问题描述:
假如我国国民生产总值的年增长率为9%,计算10年后我国国民总值与现在相比增长多少百分比。计算公式为
p = (1+r)^n
r为增长率,n为年数,p为与现在相比的倍数。
输入说明:
输入两个浮点数,分别表示年增长率和年数,两个浮点数之间用空格分隔。
输出说明:
输出一个浮点数,表示与现在相比的倍数,小数点后保留2位小数。
输入样例:
0.09 10
输出样例:
2.37
*/
#include <stdio.h>
int main(){
double r, s;
int n;
scanf("%lf %d", &r, &n);
r += 1;
s = r;
for(int i = 1; i < n; i++){
r *= s;
}
printf("%.2f", r);
}
126
/*
题目:购房贷款计算
时间限制:1S
内存限制:10000Kb
问题描述:
购房从银行贷了一笔款d,准备每月还款额为P,月利率为r,计算多少月能还清。
输入说明:
输入三个浮点数,分别表示贷款,每月还款额与月利率,三个浮点数之间用空格分隔。
输出说明:
输出以个浮点数,表示还清贷款的月数,小数点后保留2位小数。
输入样例:
300000 6000 0.01
输出样例:
69.66
*/
#include <stdio.h>
#include <math.h>
int main(){
int total,per;
float rate, count;
scanf("%d %d %f", &total, &per, &rate);
count = (
log10(
(double)per
/((double)per - total * rate)))
/log10(1.0 + rate);
printf("%.2f", count);
}
133
//0xFFFFFFFFCAFEBABE
/*
问题描述
一元 n 次多项式 p₀X₀ + p₁X₁ + ⋯ + pᵢXᵢ + ⋯ + pₙXₙ 项数较少时成为一元稀疏多项式,
例如:3 + 6X³ - 2X⁸ + 12X²⁰ 是一个一元稀疏多项式。
设计一个一元稀疏多项式计算器程序完成两个一元稀疏多项式的加减法,
输出结果多项式的各项系数和指数。
输入说明
输入数据第 1 行为 3 个正整数 n,m,t。其中 n 表示第一个多项式的项数,m 表示第二个
多项式的项数,t 表示运算类型,0 为加法,1 为减法。数据的第 2 行包含 2n 个整数,每两
个整数分别表示第一个多项式每一项的系数和指数;第 3 行包含 2m 个整数,每两个整数分
别表示第二个多项式每一项的系数和指数。两个多项式的每项是按照指数递增的形式给出的,
例如对于多项式3 + 6X3 − 2X8 + 12X20,对应的输入为 3 0 6 3 -2 8 12 20
输出说明
运算结果按指数从低到高的顺序在以多项式形式(见输出样例)输出结果,注意系数为负数
时输出减号,系数为 0 时不输出该项,指数为 1 时不输出指数。
输入样例
6 2 0
1 0 1 1 1 2 1 3 1 4 1 5
-1 3 -1 4
输出样例
1+x+x^2+x^5
*/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main() {
int n, m, t;
scanf("%d %d %d", &n, &m, &t);
int typ[700] = {0};
for (int i = 0; i < n; ++i) {
int v, exp;
scanf("%d %d", &v, &exp);
typ[100 + exp] += v;
}
for (int i = 0; i < m; ++i) {
int v, exp;
scanf("%d %d", &v, &exp);
if (t == 0) {
typ[100 + exp] += v;
} else {
typ[100 + exp] -= v;
}
}
int fir = 0;
int now = -100;
do {
if (typ[100 + now] == 0) {
now++;
continue;
}
if (now == 0) {
printf("%d", typ[100 + now]);
fir = 1;
} else {
int value = typ[100 + now];
if (value == 0) {
now++;
continue;
}
if (value > 0) {
if (fir == 1) {
printf("+");
} else {
fir = 1;
}
}
if (value == 1 || value == -1) {
if (value == -1) {
printf("-");
}
if (now == 1) {
printf("x");
} else {
printf("x^%d", now);
}
} else {
if (now == 1) {
printf("%dx", value);
} else {
printf("%dx^%d", value, now);
}
}
}
now++;
} while (now < 500);
return 0;
}
134
#include <stdio.h>
void sort(int* a, int count){
for(int i = 0; i < count-1; i++){
for(int j = 0; j < count-1-i; j++){
//compare & swap
if(a[j] < a[j+1]){
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}
int main(){
int user;
scanf("%d", &user);
int a[10];
int len;
for(len = 0; user > 0; len++){
a[len] = user%10;
user /= 10;
}
sort(a, len);
for(int i = 0; i < len; i++){
printf("%d ", a[i]);
}
return 0;
}
135
/*
问题描述
对于输入的字符串(只包含字母和数字),将其中的连续数字拼接成整数,然后将这些整数按从大到小顺序输出。
例如字符串“abc123d5e7f22k9”中共有5个数字123,5,7,22,9,因此应输出123 22 9 7 5。
输入说明
输入为一个字符串,字符串长度不超过100,其中最长的连续数字不超过10个,字符串中至少包含1个数字。
输出说明
对于输入的字符串,在一行上输出排序结果,整数间以一个空格间隔。
输入样例
abc123d5e7f22k9
输出样例
123 22 9 7 5
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int compare(const void *a, const void *b) {
return *(int*)b - *(int*)a;
}
int main() {
char str[101];
int nums[50] = {0}, numCount = 0;
scanf("%s", str);
for (int i = 0; i < strlen(str); i++) {
if (isdigit(str[i])) {
int num = 0;
while (isdigit(str[i])) {
num = num * 10 + (str[i] - '0');
i++;
}
nums[numCount++] = num;
}
}
qsort(nums, numCount, sizeof(int), compare);
for (int i = 0; i < numCount; i++) {
printf("%d ", nums[i]);
}
printf("\n");
return 0;
}
139
#include <stdio.h>
int main(){
printf("Glmre");
}
149
#include <stdio.h>
double get(int index){
return (double)index/(2*index-1) * (index%2==0 ? -1 : 1);
}
int main(){
int user;
scanf("%d", &user);
double r = 0;
for(int i = 1; i <= user; i++){
r += get(i);
}
printf("%.3f", r);
}
150
#include <stdio.h>
int main(){
int user;
scanf("%d", &user);
int result;
if(user < 1){
result = user;
}else if(user < 10){
result = 2*user - 1;
}else{
//user>=10
result = 3*user - 11;
}
printf("%d", result);
}
167
#include <stdio.h>
#define MAXCOUNT 1000
void sort(int* a, int count){
for(int i = 0; i < count-1; i++){
for(int j = 0; j < count-1-i; j++){
//compare & swap
if(a[j] > a[j+1]){
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}
int main(){
int user;
scanf("%d", &user);
int a[MAXCOUNT];
for(int i = 0; i < user; i++) scanf("%d", &a[i]);
sort(a, user);
int nums[MAXCOUNT];
int times[MAXCOUNT];
int index = 0;
//a special method
//追加-1到数组a尾部,弥补下方求次数并排序算法中,无法考虑最后一位的问题
a[user] = -1;
user++;
int count = 1;
for(int i = 1; i < user; i++){
if(a[i] == a[i-1]){
count++;
}else{
nums[index] = a[i-1];
times[index] = count;
index++;
count = 1;
}
}
//rewirtre from sort,revised comapre & swap
for(int i = 0; i < index-1; i++){
for(int j = 0; j < index-1-i; j++){
//compare & swap
if(
(times[j] < times[j+1])
||(times[j] == times[j+1] && nums[j] > nums[j+1])
){
int temp = times[j];
times[j] = times[j+1];
times[j+1] = temp;
temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
}
}
}
for(int i = 0; i < index; i++){
printf("%d %d\n", nums[i], times[i]);
}
}
169
/*
问题描述
操作系统中在查找文件时会按照某个规则对文件排序,例如下图为按照文件修改日期逆序排
序(最后修改的排在最前面)。
但目前操作系统不支持同时按照多个字段进行排序。现在请你写一个程序能够同时按照修改
日期和文件大小对文件进行排序,排序规则为:
1. 日期优先,最后修改的排在前面
2. 当修改日期相同时,大的文件排在前面。
输入说明
第一行为一个数字 n,n 表示共有 n 个待排序的文件, 1≤ n≤ 100。
接下来是 n 行,每行包含一个文件的修改日期和文件大小,这两个字段之间用空格分隔。
文件修改日期包含年、月、日,表示年、月、日的整数之间用“/”分隔,格式为“年/月/
日”。年份的数值在 1960-2018 之间;月份的数值在 1-12 之间;日的数值在 1-31 之间。
文件大小是一个不超过 100000000 的整数。
输入数据中没有完全相同的日期和文件大小。
输出说明
将输入数据按题目描述的规则排序后输出,每行输出一个文件的修改日期和文件大小。
输入样例
8
2018/1/8 1024
2012/10/31 256
2014/10/29 300
2012/10/31 457
2014/10/27 512
2011/10/27 95
2014/11/3 1102
2017/11/24 1535
输出样例
2018/1/8 1024
2017/11/24 1535
2014/11/3 1102
2014/10/29 300
2014/10/27 512
2012/10/31 457
2012/10/31 256
2011/10/27 9
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int year, month, day, size;
} File;
int compare(const void *a, const void *b) {
File *file1 = (File *)a;
File *file2 = (File *)b;
if (file1->year != file2->year) {
return file2->year - file1->year;
}
if (file1->month != file2->month) {
return file2->month - file1->month;
}
if (file1->day != file2->day) {
return file2->day - file1->day;
}
return file2->size - file1->size;
}
int main() {
int n;
scanf("%d", &n);
File files[n];
for (int i = 0; i < n; i++) {
scanf("%d/%d/%d %d", &files[i].year, &files[i].month, &files[i].day, &files[i].size);
}
qsort(files, n, sizeof(File), compare);
for (int i = 0; i < n; i++) {
printf("%d/%d/%d %d\n", files[i].year, files[i].month, files[i].day, files[i].size);
}
return 0;
}
170
//AI
/*
问题描述
考研初试成绩公布后需要对m个学生的成绩进行排序,筛选出可以进入复试的前n名学生。
排序规则为首先按照总分排序,总分相同则按英语单科成绩排序,总分和英语成绩也相同时考号小者排在前面。
现给出这m个学生的考研初试成绩,请筛选出可以进入复试的n名学生并按照排名从高到低的顺序依次输出。
输入说明
输入为m+1行,第一行为两个整数m和n,分别表示总人数和可以进入复试人数,m和n之间用空格分隔,0<n<m<200。
接下来为m行数据,每行包括三项信息,分别表示一个学生的考号(长度不超过20的字符串)、总成绩(小于500的整数)和英语单科成绩(小于100的整数),这三项之间用空格分隔。
输出说明
按排名从高到低的顺序输出进入复试的这n名学生的信息。
输入样例
5 3
XD20160001 330 65
XD20160002 330 70
XD20160003 340 60
XD20160004 310 80
XD20160005 360 75
输出样例
XD20160005 360 75
XD20160003 340 60
XD20160002 330 70
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct {
char id[21];
int total_score;
int english_score;
} Student;
int compare(const void *a, const void *b) {
Student *student_a = (Student *)a;
Student *student_b = (Student *)b;
if (student_b->total_score != student_a->total_score)
return student_b->total_score - student_a->total_score;
if (student_b->english_score != student_a->english_score)
return student_b->english_score - student_a->english_score;
return strcmp(student_a->id, student_b->id);
}
int main() {
int m, n;
scanf("%d %d", &m, &n);
Student students[m];
for (int i = 0; i < m; i++)
scanf("%s %d %d", students[i].id, &students[i].total_score, &students[i].english_score);
qsort(students, m, sizeof(Student), compare);
for (int i = 0; i < n; i++)
printf("%s %d %d\n", students[i].id, students[i].total_score, students[i].english_score);
return 0;
}
171
/*
问题描述
实验室使用考勤系统对学生进行考勤。考勤系统会记录下每个学生一天内每次进出实验室的时间。
每位学生有一个唯一编号,每条考勤记录包括学生的编号,进入时间、离开时间。
给出所有学生一天的考勤记录,请统计每个学生在实验室工作的时间,并按照工作时间从长到短给出一天的统计表,工作时间相同时按编号从小到大排序。
输入说明
输入的第一行包含一个整数n,表示考勤记录条数。1≤n≤100,学生的编号为不超过100的正整数。
接下来是n行,每行是一条考勤记录,每条记录包括学生编号k,进入时间t1和离开时间t2三项。
t1和t2格式为“hh:mm”,即两位数表示的小时和两位数表示的分钟。例如14:20表示下午两点二十分,所有时间均为24小时制,且均为同一天内的时间。
输出说明
输出按工作时间和学生编号排序的统计表。统计表包含若干行,每行为一个学生的出勤记录,由学生编号和总工作时间构成,总工作时间以分钟为单位。
输入样例
5
3 08:00 11:50
1 09:00 12:00
3 13:50 17:30
1 14:00 18:00
2 17:00 24:00
输出样例
3 450
1 420
2 420
*/
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
int ids[101] = {0}, times[101] = {0};
for (int i = 0; i < n; i++) {
int id, h1, m1, h2, m2;
scanf("%d %d:%d %d:%d", &id, &h1, &m1, &h2, &m2);
ids[id] = id;
times[id] += (h2 - h1) * 60 + (m2 - m1);
}
for (int i = 1; i <= 100; i++) {
for (int j = i + 1; j <= 100; j++) {
if (times[i] < times[j] || (times[i] == times[j] && ids[i] > ids[j])) {
int temp = times[i];
times[i] = times[j];
times[j] = temp;
temp = ids[i];
ids[i] = ids[j];
ids[j] = temp;
}
}
}
for (int i = 1; i <= 100; i++) {
if (ids[i] != 0) {
printf("%d %d\n", ids[i], times[i]);
}
}
return 0;
}
173
//0xFFFFFFFFCAFEBABE
/*
问题描述
请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。
假设一节车厢有20排、每一排5个座位。为方便起见,我们用1到100来给所有的座位编号,第一排是1到5号,第二排是6到10号,依次类推,第20排是96到100号。
购票时,一个人可能购一张或多张票,最多不超过5张。如果这几张票可以安排在同一排编号相邻的座位,则应该安排在编号最小的相邻座位。否则应该安排在编号最小的几个空座位中(不考虑是否相邻)。
假设初始时车票全部未被购买,现在给了一些购票指令,请你处理这些指令,输出购票结果。
例如:若一次购买2,5,4,2张票得到的购票结果为:
1) 购2张票,得到座位1、2。
2) 购5张票,得到座位6至10。
3) 购4张票,得到座位11至14。
4) 购2张票,得到座位3、4。
输入说明
输入由两行构成。
第一行包含一个整数n,表示购票指令的数量,1 ≤ n ≤ 100。
第二行包含n个整数,每个整数p在1到5之间,表示要购入的票数,相邻的两个整数之间使用一个空格分隔,所有购票数量之和不超过100。
输出说明
输出n行,每行对应一条购票指令的处理结果。即对于购票指令p,按从小到大排序输出p张车票的编号。
输入样例
4
2 5 4 2
输出样例
1 2
6 7 8 9 10
11 12 13 14
3 4
*/
#include <stdio.h>
#include <math.h>
int main() {
int n;
scanf("%d", &n);
int dp[101] = {0};
for (int i = 0; i < n; ++i) {
int t;
scanf("%d", &t);
for (int j = 1; j <= 100; ++j) {
if (dp[j] == 0 && t != 0) {
//checkAfter
int cmb = 0;
for (int k = j; k <= 100; ++k) {
if (dp[k] == 0) {
cmb++;
}
if (k % 5 == 0) {
break;
}
}
if (cmb >= t) {
for (int k = 0; k < t; ++k) {
printf("%d ", k + j);
dp[k + j] = 1;
}
t = 0;
}
}
}
for (int j = 1; j <= 100; ++j) {
if (dp[j] == 0 && t != 0) {
dp[j] = 1;
t--;
printf("%d ", j);
}
}
printf("\n");
}
return 0;
}
177
#include <stdio.h>
#include <string.h>
#define MAXLEN 100
int main(){
char str[MAXLEN];
int len;
scanf("%[^\n]", str);
len = strlen(str);
int sum = 0;
for(int i = 0; i < len; i++){
sum += str[i];
}
printf("%d", sum%0x100);
}
185
#include <stdio.h>
#include <math.h>
#define ESP 1e-5
double getNext(double last, double target){
return 0.5*(last + target/last);
}
int main(){
double target;
scanf("%lf", &target);
double x1;
double x2 = 1.0;
int hasNext = 1;
while(hasNext){
x1 = x2;
x2 = getNext(x1, target);
if(fabs(x1 - x2) <= ESP) hasNext = 0;
}
printf("%.5f", x2);
}
215
#include <stdio.h>
/**
* Get length
*/
int len(char *str){
int length = 0;
while (str[length] != '\0') {
length++;
}
return length;
}
/**
* print but reverse
*/
void reverse(char *str){
int i = len(str) - 1;
while(i >= 0){
printf("%c", str[i]);
i--;
}
}
int main(){
char str[64];
scanf("%s", str);
reverse(str);
}
219
#include <stdio.h>
int isPrime(int n){
int flag = (n == 1 ? 0 : 1);
for(int i = 2; i < n/2; i++){
if(n%i == 0){
flag = 0;
break;
}
}
return flag;
}
int main(){
int user;
scanf("%d", &user);
printf("%s", isPrime(user) ? "YES" : "NO");
}
221
#include <stdio.h>
int len1(char *str){
int r = 0;
int index = 0;
while (str[index] != '\0') {
if((str[index] >= 'A' && str[index] <= 'Z')
||
(str[index] >= 'a' && str[index] <= 'z')
)r++;
index++;
}
return r;
}
int len2(char *str){
int r = 0;
int index = 0;
while (str[index] != '\0') {
if((str[index] >= '0' && str[index] <= '9')
)r++;
index++;
}
return r;
}
int main(){
char str[64];
scanf("%s", str);
printf("%d", len1(str));
printf(",");
printf("%d", len2(str));
return 0;
}
224
#include <stdio.h>
int main() {
int matrixA[2][3], matrixB[3][2], result[2][2];
// printf("Enter elements for matrix A (2x3):\n");
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
scanf("%d", &matrixA[i][j]);
}
}
// printf("Enter elements for matrix B (3x2):\n");
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 2; j++) {
scanf("%d", &matrixB[i][j]);
}
}
// 矩阵相乘
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
result[i][j] = 0;
for (int k = 0; k < 3; k++) {
result[i][j] += matrixA[i][k] * matrixB[k][j];
}
}
}
// printf("Result of matrix A * matrix B:\n");
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
printf("%d ", result[i][j]);
}
printf("\n");
}
return 0;
}
227
#include <stdio.h>
int len1(char *str){
int r = 0;
int index = 0;
while (str[index] != '\0') {
if((str[index] >= 'A' && str[index] <= 'Z')
||
(str[index] >= 'a' && str[index] <= 'z')
)r++;
index++;
}
return r;
}
int main(){
char s[64];
scanf("%s", s);
printf("%d", len1(s));
}
228
#include <stdio.h>
void del(char* str, char* tar){
int i = 0;
int j = 0;
while(str[i] != '\0'){
if(i%2 == 0){
tar[j] = str[i];
tar++;
}
i++;
}
tar[j] = '\0';
}
int main(){
char user[64];
char r[64];
scanf("%s", user);
del(user, r);
printf("%s", r);
}
229
#include <stdio.h>
/**
* 这里有个取巧的办法,就是读入s1和s2两个字符串之后,原封不动的输出出来就行
* 不必新建一个t来储存s1和s2的结合体
*
* 不过我还是按照题目功能写了处理t的函数了
*/
int len(char *str){
int length = 0;
while (str[length] != '\0') {
length++;
}
return length;
}
void fun(char* s1, char* s2, char* tar){
int l1 = len(s1);
int l2 = len(s2);
for(int i = 0; i < l1; i++){
tar[i] = s1[i];
}
for(int i = 0; i < l2; i++){
tar[i+l1] = s2[i];
}
tar[l1+l2] = '\0';
}
int main(){
char s1[64];
char s2[64];
scanf("%s%*c%s", s1, s2);
char t[128];
fun(s1, s2, t);
printf("%s", t);
}
230
#include <stdio.h>
int isPrime(int n){
int flag = (n == 1 ? 0 : 1);
for(int i = 2; i <= n/2; i++){
if(n%i == 0){
flag = 0;
break;
}
}
return flag;
}
int fun(int n, int tar[]){
int r = 0;
for(int i = 2; i <= n; i++){
if(isPrime(i)){
tar[r] = i;
r++;
}
}
return r;
}
int main(){
int user;
scanf("%d", &user);
int a[256]; //1000内有160多个素数
int l = fun(user, a);
printf("%d\n", l);
for(int i = 0; i < l; i++){
printf("%d ", a[i]);
}
return 0;
}
240
#include <stdio.h>
/**
* 题目很莫名其妙
* 于是我偷懒了
*/
int main(){
char s[64];
scanf("%s", s);
printf("%s", s);
}
241
#include <stdio.h>
int main(){
int user;
scanf("%x", &user);
printf("%d", user);
}
242
#include <stdio.h>
typedef struct structStudent{
int id;
char name[20];
int score[3];
double average;
}Student;
double stuAverage(Student stu){
double sum = 0;
for(int i = 0; i < 3; i++){
sum += stu.score[i];
}
return sum / 3;
}
void sortStudents(Student stu[], int count){
Student temp;
for(int i = 0; i < count; i++){
for(int j = i + 1; j < count; j++){
if(stu[i].average < stu[j].average){
temp = stu[i];
stu[i] = stu[j];
stu[j] = temp;
}else if(stu[i].average == stu[j].average){
if(stu[i].id > stu[j].id){
temp = stu[i];
stu[i] = stu[j];
stu[j] = temp;
}
}
}
}
}
int main(){
Student stu[100];
int count;
scanf("%d", &count);
for(int i = 0; i < count; i++){
scanf("%d %s %d %d %d", &stu[i].id, stu[i].name, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2]);
stu[i].average = stuAverage(stu[i]);
}
sortStudents(stu, count);
for(int i = 0; i < count; i++){
printf("%d %s %.1lf\n", stu[i].id, stu[i].name, stu[i].average);
}
}
243
#include <stdio.h>
typedef struct structStudent{
char name[20];
int score;
int score2;
} Student;
void sortStudents(Student stu[], int count){
Student temp;
for(int i = 0; i < count; i++){
for(int j = i + 1; j < count; j++){
if(stu[i].score < stu[j].score){
temp = stu[i];
stu[i] = stu[j];
stu[j] = temp;
}else if(stu[i].score == stu[j].score){
if(stu[i].score2 < stu[j].score2){
temp = stu[i];
stu[i] = stu[j];
stu[j] = temp;
}
}
}
}
}
int main(){
Student stu[100];
int count;
scanf("%d", &count);
for(int i = 0; i < count; i++){
int score[5];
scanf("%s %d %d %d %d %d %d",
stu[i].name,
&score[0], &score[1], &score[2], &score[3], &score[4],
&stu[i].score2
);
stu[i].score = score[0] + score[1] + score[2] + score[3] + score[4] + stu[i].score2;
}
sortStudents(stu, count);
for(int i = 0; i < count; i++){
printf("%s %d %d\n", stu[i].name, stu[i].score, stu[i].score2);
}
}
301
#include <stdio.h>
/**
* parse factors from num
* store result to tar[]
* and return the number of factors
*/
int praseFactor(int num, int tar[]){
int index = 0;
for(int i = 1; i < num; i++){
if(num % i == 0){
tar[index] = i;
index++;
}
}
return index;
}
/*
_ooOoo_
o8888888o
88" . "88
(| -_- |)
O\ = /O
____/`---'\____
.' \\| |// `.
/ \\||| : |||// \
/ _||||| -:- |||||- \
| | \\\ - /// | |
| \_| ''\---/'' | |
\ .-\__ `-` ___/-. /
___`. .' /--.--\ `. . __
."" '< `.___\_<|>_/___.' >'"".
| | : `- \`.;`\ _ /`;.`/ - ` : | |
\ \ `-. \_ __\ /__ _/ .-` / /
======`-.____`-.___\_____/___.-`____.-'======
`=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
佛祖保佑 永无BUG
*/
int getSum(int tar[], int n){
int r = 0;
for(int i = 0; i < n; i++){
r += tar[i];
}
return r;
}
int main(){
int user1 = 220;
scanf("%d", &user1);
int g1[500];
int n1 = praseFactor(user1, g1);
int s1 = getSum(g1, n1);
int user2 = 284;
scanf("%d", &user2);
int g2[500];
int n2 = praseFactor(user2, g2);
int s2 = getSum(g2, n2);
printf("%s ",
s1 == user2 && s2 == user1 ? "yes" : "no");
printf("%d %d", n1, n2);
}
374
/* 描述: 沸腾的水(100℃)在室温下温度随时间变化的曲线如图所示,给出时间,计算水的温度。
c = {
100 − 5t,0 ≤ t ≤ 10
50 − (t − 10),10 < t ≤ 30
30 − (t − 30) / 2,30 < t ≤ 50
20,50 < t
}
输入:
第一行为两个整数 m(m ∈ [0,100]),s(s ∈ [0,59]),分别表示降温时间的分钟数和秒数。
输出:
输出一个小数,表示输入时间对应的水的温度,温度保留 1 位小数。
输入样例:
5 30
输出样例:
72.5
*/
#include <stdio.h>
int main(){
short int m, s;
scanf("%hd%hd", &m, &s);
double t = m + s/60.0;
if(t<=10){
printf("%.1f", 100.0 - 5*t);
}else if(t<=30){
printf("%.1f", 60.0 - t);
}else if(t<=50){
printf("%.1f", 45.0 - 0.5*t);
}else{
printf("%.1f", 20.0);
}
}
385
#include <stdio.h>
int isPassed(int);
int main(){
int map[3] = {0};
//总报出的数字
int totalCount;
scanf("%d", &totalCount);
int count = 1;
for(int num = 1; count <= totalCount; num++){
//无论报或不报,数字都会落到同学头上,由此根据当前num判断这个数字落到了谁头上
int stu = num % 3;
if(isPassed(num)){//如果该数字不报
map[stu]++;//给同学记录一次没报
}else{//如果数字报出
count++;//已报出的数字加一
}
}
//根据stu=num%3,stu1表示第一位同学,stu2表示第二位,stu0表示第三位
printf("%d %d %d", map[1], map[2], map[0]);
}
int isPassed(int num){
if(num % 7 == 0) return 1;
while(num > 0){
if(num % 10 == 7) return 1;
num = num / 10;
}
}
388
/*
输入5个字符,统计其中字符a的个数。每个字符以空格间隔,大写A
也算
输入1:
a b c d e
输出1:
1
输入2:
a A b c a
输出2:
3
*/
#include <stdio.h>
int main(){
char a[5];
int count = 0;
scanf("%c %c %c %c %c", &a[0], &a[1], &a[2], &a[3], &a[4]);
for(int i = 0; i < 5; i++){
if( a[i] == 'a' || a[i] == 'A'){
count += 1;
}
}
printf("%d", count);
}
390
#include <stdio.h>
int fac(int n){
int r = 1;
for(int i = 2; i <= n; i++){
r *= i;
}
return r;
}
int main(){
int user;
scanf("%d", &user);
for(int i = 1; i <= user; i++){
printf("%d ", fac(i));
}
return 0;
}
391
#include <stdio.h>
int getFib(int index){
int r;
if(index == 1 || index == 2) r = 1;
else r = getFib(index-1) + getFib(index-2);
return r;
}
int main(){
int user;
scanf("%d", &user);
for(int i = 1; i <= user; i++){
printf("%d ", getFib(i));
}
return 0;
}
392
//version 2
int compare(int x, int y){
int flag;
if(x%2 == 0 && y%2 != 0) flag = 1;
else if(x%2 != 0 && y%2 == 0) flag = -1;
else flag = x-y;
return flag;
}
398
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char *compress(char *src);
int main()
{
char src[100];
scanf("%s",src);
char *ps = compress(src);
puts(ps);
return 0;
}
char *compress(char *src){
char alphas[100] = "";
int counts[100] = {0,};
int ArrayCount = 0;
int tempCount = 0;
char tempChar = src[0];
for(int i = 0; i < strlen(src)+1; i++){
if(tempChar == src[i]){
tempCount++;
}else{
alphas[ArrayCount] = tempChar;
counts[ArrayCount] = tempCount;
ArrayCount++;
tempChar = src[i];
tempCount = 1;
}
}
char *result = (char *)malloc(sizeof(char) * 100);
int resultCount = 0;
for(int i = 0; i < ArrayCount; i++){
result[resultCount++] = alphas[i];
if(counts[i] > 9){
result[resultCount++] = counts[i] / 10 + '0';
result[resultCount++] = counts[i] % 10 + '0';
}else if(counts[i] > 2){
result[resultCount++] = counts[i] + '0';
}else if(counts[i] == 2){
result[resultCount++] = alphas[i];
}
}
result[resultCount] = '\0';
return result;
}
405
//Contributed from @Kirin
#include<stdio.h>
int main()
{
int m;
double n;
scanf("%d %lf",&m,&n);
if (m == 1){
printf("yes ");
if (n>=500) printf("%.1f %.1f %.1f",n,n*0.8,n - n*0.8);
else if (n>=350 && n<500) printf("%.1f %.1f %.1f",n,n*0.85,n - n*0.85);
else if (n>=200 && n<350) printf("%.1f %.1f %.1f",n,n*0.9,n - n*0.9);
else printf("%.1f %.1f %.1f",n,n,0);
}
else{
printf("no ");
if (n>=500) printf("%.1f %.1f %.1f",n,n*0.9,n - n*0.9);
else if (n>=350 && n<500) printf("%.1f %.1f %.1f",n,n*0.95,n - n*0.95);
else printf("%.1f %.1f %.1f",n,n,0);
}
return 0;
}
406
//Contributed from @Kirin
#include <stdio.h>
int main() {
char c,a;
scanf("%c", &c); // 读取一个字符
a = c;
// 根据字符类型进行转换
if (c >= 'a' && c <= 'z') { // 小写字母
c = (c - 'a' + 3) % 26 + 'a'; // 转换为 'a' 到 'c' 之间的字符,然后循环
} else if (c >= 'A' && c <= 'Z') { // 大写字母
c = (c - 'A' + 26 - 2) % 26 + 'A';
} else if (c >= '0' && c <= '9') {
c = '0' + '9' - c;
} else if (c == ' ') { // 空格
c = '*'; // 转换为空星号
} else {
c = '#';
}
printf("%c %c", a, c);
return 0;
}
425
#include <stdio.h>
int main(){
int user;
scanf("%d", &user);
int s[51] = {0, 1, 1, 2, };
for(int i = 4; i < 51; i++){
s[i] = s[i-1]+s[i-3];
}
printf("%d", s[user]);
return 0;
}
449
/*
题目:套餐选择
问题描述
套餐A无月租费,话费每分钟0.6元,套餐B月租费50元,话费每分钟0. 4元。输入一个月的通话时间,分别计算出两种套餐的费用,并判断哪一种合适。
输入格式
输入为一个浮点数t,表示一个月的通话时间。
输出格式
输出为两种套餐的费用及判断结果,结果保留两位小数。
样例输入
2000
样例输出
1200.00
850.00
B
样例说明
2000x0.6=1200.00;50+2000.00x0.4=850.00;套餐B更划算。
评测用例规模与约定
1 ≤ t ≤ 10000,A和B花费一样时选B。
*/
#include <stdio.h>
int main(){
short int min;
scanf("%hd", &min);
printf("%.2f\n", 0.6*min);
printf("%.2f\n", 50 + 0.4*min);
if(min < 250){
printf("A");
}else{
printf("B");
}
}
457
//Contributed from @Kirin
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int a[2*n];
for (int j=1;j<=2*n;j++){
scanf("%d",&a[j]);
}
for(int i=1;i<=n;i++){
int temp;
temp = a[i];
a[i] = a[n+i];
a[n+i] = temp;
}
for(int i=1;i<=2*n;i++){
printf("%d",a[i]);
if (i<2*n) printf(" ");
}
return 0;
}
458
//Contributed from @Kirin
#include <stdio.h>
int sumOfDigits(int n);
int main() {
int n;
scanf("%d", &n);
printf("%d\n", sumOfDigits(n));
return 0;
}
int sumOfDigits(int n) {
int sum = 0;
while (n > 0) {
sum += n % 10;
n /= 10;
}
return sum;
}
459
//Contributed from @Kirin
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
// 函数声明,用于判断字符串是否为回文
bool isPalindrome(const char *s);
int main() {
char s[100]; // 字符串长度不超过100,加1用于存储字符串结束符'\0'
scanf("%100s", s); // 读取字符串,限制长度为100
if (isPalindrome(s)) {
printf("Yes\n");
} else {
printf("No\n");
}
return 0;
}
// 函数定义,用于判断字符串是否为回文
bool isPalindrome(const char *s) {
int left = 0; // 左指针
int right = strlen(s) - 1; // 右指针,减1是因为strlen不包括'\0'
while (left < right) { // 当左指针小于右指针时继续循环
if (s[left] != s[right]) { // 如果左右指针所指的字符不相等,则不是回文
return false;
}
left++; // 左指针向右移动
right--; // 右指针向左移动
}
return true; // 如果所有对应字符都相等,则是回文
}
460
//Contributed from @Kirin
#include<stdio.h>
int main()
{
int n,sum=1;
scanf("%d",&n);
for (int i=1;i<=n;i++){
sum = sum*i;
}
printf("%d",sum);
return 0;
}
461
//Contributed from @Kirin
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int i=2;
while(i<n && n%i!=0) i++;
if (i==n) printf("Yes");
else printf("No");
return 0;
}
464
#include <stdio.h>
void printFactorial(int n);
int main()
{
int n;
//scanf("%d", &n);
n=50;
printFactorial(n);
return 0;
}
void printFactorial(int n){
int number[3000] = {0, 1, };
int digits = 1;
for(int factor = 2; factor <= n; factor++){
int temp;
//每一位乘以因数
for(int index = 1; index <= digits; index++){
number[index] *= factor;
}
//执行进位操作
int hasNext = 1;
for(int index = 1; hasNext; index++){
if(number[index] >= 10){
temp = number[index] / 10;
number[index] = number[index] % 10;
number[index+1] = number[index+1] + temp;
if(index == digits) digits++;
}
if(index == digits) hasNext = 0;
}
/*
//操作刚才溢出的数据
hasNext = 1;
for(int index = digits; hasNext; index++){
if(number[index] < 10) hasNext = 0;
else{
temp = number[index] / 10;
number[index] = number[index] % 10;
number[index+1] = number[index+1] + temp;
digits++;
}
}
*/
}
for(int i = digits; i > 0; i--){
printf("%d", number[i]);
}
}
void MY_printFactorial(int n){
if(n <= 1000){
long long int result = 1;
for(int i = 1; i <= n; i++){
result = result * i;
}
printf("%lld", result);
}else{
printf("Invalid input\n");
}
}
void OTHER_printFactorial(int n) {
int a[2599] = {0, 1};
int weishu = 1;
for (int i = 2; i <= n; i++) {
int up = 0;
int temp = 0;
for (int j = 1; j <= weishu || up != 0; j++) {
temp = a[j] * i + up;
up = temp / 10;
a[j] = temp % 10;
weishu = (j > weishu ? j : weishu);
}
}
for (int i = weishu; i >= 1; i--) {
printf("%d", a[i]);
}
}
490
#include <stdio.h>
const char less[] = "Too small";
const char more[] = "Too big";
const char equal_in1[] = "Bingo!";
const char equal_in3[] = "Lucky You!";
const char equal_inN[] = "Good Guess!";
const char game_over[] = "Game Over";
int main(){
}
525
#include <stdio.h>
/**
* 本题可以用动态规划来解决,但是我不会
*
* 我的算法就是穷尽,很暴力,但很简单
* 动态规划的话,程序效率会很高
*
* 以后学了动态规划再说吧……
*/
int main(){
int user;
scanf("%d", &user);
int a[10000];
for(int i = 0; i < user; i++){
scanf("%d", &a[i]);
}
int max = 0;
for(int i = 0; i < user; i++){
for(int j = 1; j < user; j++){
int sum = 0;
for(int x = i; x <= j; x++){
sum += a[x];
}
if(sum > max) max = sum;
}
}
printf("%d", max);
}
526
//Contributed from @Kirin
#include<stdio.h>
int max(int a, int b) {
return (a > b) ? a : b;
}
int main()
{
int n;
scanf("%d",&n);
int a[n+1];
for(int i=0;i<n;i++) scanf("%d",&a[i]);
int maxn=0;
int temp=1;
for (int j=0;j<n;j++){
if(a[j] == a[j+1]) temp+=1;
else {
maxn = max(maxn,temp*a[j]);
temp = 1;
}
}
maxn = max(maxn,a[n-1]);
printf("%d",maxn);
return 0;
}
528
//FROM: 墨珩
/*题目:最接近的三数之和
问题描述
给你一个长度为?n?的整数数组?nums?和 一个目标值?target。请你从?nums?中选出三个整数,使它们的和与?target?最接近。
返回这三个数的和。
若每组输入存在多个解,给出一个即可。
输入格式
第一行:数组长度n
第二行:长度为n的数组
第三行:目标值target
输出格式
三个数之和
样例输入
4
-1 2 1 -4
1
样例输出
2
样例说明
3 ≤ nums.length ≤ 1000
-1000 ≤ nums[i] ≤ 1000
-10^4 ≤ target ≤ 10^4*/
#include <stdio.h>
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
void bubbleSort(int *nums, int numsSize) {
int i,j;
for (i = 0; i < numsSize - 1; i++) {
for (j = 0; j < numsSize - i - 1; j++) {
if (nums[j] > nums[j + 1]) {
swap(&nums[j], &nums[j + 1]);
}
}
}
}
int customAbs(int x) {
return x >= 0 ? x : -x;
}
void threeSumClosest(int *nums, int numsSize, int target) {
if (numsSize < 3) {
return;
}
bubbleSort(nums, numsSize);
int closestSum = nums[0] + nums[1] + nums[2];
int i,j,k;
for (i = 0; i < numsSize - 2; i++) {
for (j = i + 1; j < numsSize - 1; j++) {
for (k = j + 1; k < numsSize; k++) {
int currentSum = nums[i] + nums[j] + nums[k];
if (customAbs(currentSum - target) < customAbs(closestSum - target)) {
closestSum = currentSum;
}
}
}
}
printf("%d\n", closestSum);
}
int main() {
int n,i;
scanf("%d", &n);
int nums[100];
for (i = 0; i < n; i++) {
scanf("%d", &nums[i]);
}
int target;
scanf("%d", &target);
threeSumClosest(nums, n, target);
return 0;
}
540
#include <stdio.h>
#include <string.h>
void reverse(char*, int, int);
int main(){
char user[10000] = "";
int k;
scanf("%s%d", user, &k);
int len = strlen(user);
//总共多少个组2k
int groups = len/(2*k);
//还剩余多少个字符不足2k
int remains = len - groups * 2*k;
//先反转所有的2k组合
for(int i = 0; i < groups; i++){
int index1 = i * 2 * k;
int index2 = index1 + k - 1;
reverse(user, index1, index2);
}
//处理剩余的不足2k的部分
if(remains != 0){
if(remains < k){
reverse(user, len-remains, len-1);
}else{
reverse(user, len-remains, len-remains+k-1);
}
}
puts(user);
}
/**
* 反转字符数组中下标位于[start, end]间的所有字符
*/
void reverse(char* str, int start, int end){
int len = strlen(str);
if(start < end){
for(int i = 0; i <= (end-start-1)/2; i++){
//交换对称两个字符,为了少写几次下标用了指针,只要能交换就行
char* p1 = &str[start+i];
char* p2 = &str[end-i];
char temp = *p1;
*p1 = *p2;
*p2 = temp;
}
}
}
545
#include <stdio.h>
int main(){
int lines;//表示总行数
int map[101] = {0};//map[i]表示标签i出现的次数
scanf("%d", &lines);
for(int i = 0; i < lines; i++){//针对每行进行处理
//用户输入
int count;
int temp[100];
scanf("%d", &count);
for(int i = 0; i < count; i++) scanf("%d", &temp[i]);
//temp[i]表示第i个用户输入的标签,这个标签出现的次数是map[temp[i]]
for(int i = 0; i < count; i++){
map[temp[i]]++;
}
}
//用户全部输入结束,搜索最大值
int tag = 0;
int max = 0;
for(int i = 0; i < 101; i++){
if(map[i] >= max){
max = map[i];
tag = i;
}
}
printf("%d %d", tag, max);
}
563
#include <stdio.h>
#define MAXLIST 10000
int isPrime(int n){
int flag = (n == 1 ? 0 : 1);
for(int i = 2; i <= n/2; i++){
if(n%i == 0){
flag = 0;
break;
}
}
return flag;
}
int main(){
int user;
scanf("%d", &user);
int list[MAXLIST];
int len = 0;
for(int i = 2; i < user; i++){
if(isPrime(i)){
list[len] = i;
len++;
}
}
for(int i = 2; i < len; i++){
if(list[i] - list[i-1] == 2) printf("%d %d\n", list[i-1], list[i]);
}
if(user < 5) printf("empty");
return 0;
}
568
//Contributed from @Kirin
#include <stdio.h>
#include <math.h>
int main() {
double D, H;
scanf("%lf %lf", &D, &H); // 读取底部直径和高度
double radius = D / 2.0; // 计算半径
double volume = (1.0 / 3.0) * 3.1415926 * pow(radius, 2) * H; // 计算圆锥体体积
double densityIron = 7.86; // 铁的比重
double densityGold = 19.3; // 金的比重
double massIron = volume * densityIron; // 计算铁圆锥体的质量
double massGold = volume * densityGold; // 计算金圆锥体的质量
printf("%.3lf %.3lf\n", massIron / 1000.0, massGold / 1000.0); // 输出质量和,单位转换为kg,并保留3位小数
return 0;
}
569
//Contributed from @Kirin
#include<stdio.h>
int main()
{
int n;
int a[5];
scanf("%d",&n);
if (n<0) n = -n;
int temp=0;
while (n/10 != 0){
a[temp] = n%10;
n = n/10;
temp+=1;
}
a[temp] = n;
for (int i=temp;i>=0;i--) {
printf("%d",a[i]);
if (i != 0) printf(" ");
}
printf("\n");
for (int j=0;j<=temp;j++) {
printf("%d",a[j]);
if (j != temp) printf(" ");
}
return 0;
}
570
//Contributed from @Kirin
#include <stdio.h>
int main() {
int a, b;
scanf("%d %d", &a, &b); // 读取两个整数
int sum = a + b; // 计算和
int difference = a - b; // 计算差
int product = a * b; // 计算积
int quotient = a / b; // 计算商
int remainder = a % b; // 计算余
printf("%d %d %d %d %d\n", sum, difference, product, quotient, remainder); // 输出结果
return 0;
}
571
//Contributed from @Kirin
#include<stdio.h>
#include<math.h>
const double PI = 3.1415926;
const double p = 0.785;
int main()
{
double h1,r1,r2,h2;
scanf("%lf %lf %lf %lf",&r1,&h1,&r2,&h2);
r1 = r1/2.0;
r2 = r2/2.0;
double v,v1,v2,m;
v1 = PI*r1*r1*h1;
v2 = PI*r2*r2*h2*1.0/3.0;
v = v1 - v2;
m = v*p;
printf("%.1lf %.1lf",v,m);
return 0;
}
572
//Contributed from @Kirin
#include<stdio.h>
#include<math.h>
int main()
{
float a,b;
scanf("%f %f",&a,&b);
float CL,tD,SP;
CL = a + sqrt(b*a+1);
tD = a * (CL + b)*(CL + b);
SP = CL*tD + b*b;
printf("CL=%.2f tD=%.2f SP=%.2f",CL,tD,SP);
return 0;
}
573
//Contributed from @Kirin
#include<stdio.h>
int main()
{
int h=0,m=0,s;
scanf("%d",&s);
if (s>=60) {
m = s/60;
s = s%60;
}
if (m>=60) {
h = m/60;
m = m%60;
}
if (h < 12) printf("%02d:%02d:%02d am",h,m,s);
else printf("%02d:%02d:%02d pm",h,m,s);
return 0;
}
583
//Contributed from @Kirin
#include <stdio.h>
// 计算利息的函数
double calculate_interest(double principal, double rate, int years) {
return principal * (1 + rate * years);
}
int main() {
double amount = 1000; // 初始存款金额
double rate_3_year = 0.0275; // 3年期年利率
double rate_2_year = 0.021; // 2年期年利率
double rate_1_year = 0.015; // 1年期年利率
double rate_demand = 0.0035 / 4; // 活期季度利率
// 方案1:先存3年定期再存2年定期
double final_amount_1 = calculate_interest(amount, rate_3_year, 3);
final_amount_1 = calculate_interest(final_amount_1, rate_2_year, 2);
printf("先存3年定期再存2年定期,最终金额:%.2f;\n", final_amount_1);
// 方案2:先存2年定期再存3年定期
double final_amount_2 = calculate_interest(amount, rate_2_year, 2);
final_amount_2 = calculate_interest(final_amount_2, rate_3_year, 3);
printf("先存2年定期再存3年定期,最终金额:%.2f;\n", final_amount_2);
// 方案3:现存1年定期,再存2两年定期,再分2年存一年定期
double final_amount_3 = calculate_interest(amount, rate_1_year, 1);
final_amount_3 = calculate_interest(final_amount_3, rate_2_year, 2);
final_amount_3 = calculate_interest(final_amount_3, rate_1_year, 1);
printf("现存1年定期,再存2两年定期,再分2年存一年定期,最终金额:%.2f;\n", final_amount_3);
// 方案4:先存3年定期再存2年活期
double final_amount_4 = calculate_interest(amount, rate_3_year, 3);
final_amount_4 = calculate_interest(final_amount_4, rate_demand, 2 * 4); // 2年活期,每季度结算一次
printf("先存3年定期再存2年活期,最终金额:%.2f;\n", final_amount_4);
return 0;
}
601
//Contributed from @Kirin
#include<stdio.h>
int main()
{
printf("Hello, World!");
return 0;
}
604
//Contributed from @Kirin
#include<stdio.h>
int max(int a,int b){
if (a > b) return a;
else return b;
}
int main()
{
int q,w,e;
scanf("%d %d %d",&q,&w,&e);
int ddd = max(max(q,w),e);
printf("%d",ddd);
return 0;
}
612
#include <stdio.h>
#include <math.h>
int main(){
int user;
scanf("%d", &user);
double r = 0;
for(int i = 1; i <= user; i++){
r += sin(1.0/i);
}
printf("%.2f", r);
}
613
//Contributed from @Kirin
#include<stdio.h>
#include<math.h>
int main()
{
double a;
scanf("%lf",&a);
printf("%.2lf\n",pow(a,3)*19.32);
printf("%.2lf\n",pow(a,3)*10.53);
printf("%.2lf\n",pow(a,3)*8.9);
return 0;
}
615
//Contributed from @Kirin
#include<stdio.h>
int main()
{
int h=0,m=0,s,d;
scanf("%d",&s);
if (s>=60) {
m = s/60;
s = s%60;
}
if (m>=60) {
h = m/60;
m = m%60;
}
if (h>=24) {
d = h/24;
h = h%24;
}
printf("%d %d %d %d",d,h,m,s);
return 0;
}
616
//see https://kites.cc/u/oj/Archived/7.c
//不完全相同!
641
#include <stdio.h>
#define MAX_M 100
#define MAX_N 100
struct Node {
int x, y, time;
};
int m, n;
int maze[MAX_M][MAX_N];
int visited[MAX_M][MAX_N];
// 定义四个方向的移动
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, -1, 0, 1};
// 判断某个位置是否在迷宫范围内且可通行
int isValid(int x, int y) {
return (x >= 0 && x < m && y >= 0 && y < n && maze[x][y] == 0 && !visited[x][y]);
}
// 使用 BFS 计算最短时间
int bfs(int startX, int startY, int endX, int endY) {
struct Node queue[MAX_M * MAX_N];
int front = 0, rear = 0;
// 初始化起点并入队
struct Node newNode;
newNode.x = startX;
newNode.y = startY;
newNode.time = 0;
queue[rear++] = newNode;
visited[startX][startY] = 1;
while (front < rear) {
struct Node current = queue[front++];
if (current.x == endX && current.y == endY) {
return current.time;
}
// 尝试四个方向的移动
for (int i = 0; i < 4; i++) {
int newX = current.x + dx[i];
int newY = current.y + dy[i];
if (isValid(newX, newY)) {
struct Node newNode;
newNode.x = newX;
newNode.y = newY;
newNode.time = current.time + 1;
queue[rear++] = newNode;
visited[newX][newY] = 1;
}
}
}
return -1; // 若无法到达出口,则返回-1表示无法找到路径
}
int main() {
int startX, startY, endX, endY;
// 读取迷宫大小
scanf("%d %d", &m, &n);
// 读取入口和出口坐标
scanf("%d %d %d %d", &startX, &startY, &endX, &endY);
// 读取迷宫内容
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &maze[i][j]);
visited[i][j] = 0;
}
}
int shortestTime = bfs(startX, startY, endX, endY);
if (shortestTime != -1) {
printf("%d", shortestTime);
} else {
printf("无法到达出口\n");
}
return 0;
}
671
#include <stdio.h>
int main(){
int count;
int nums[30];
scanf("%d", &count);
for(int i = 0; i < count; i++){
scanf("%d", &nums[i]);
}
int average = 0;
for(int i = 0; i < count; i++){
average += nums[i];
}
average /= count;
int s = 0;
for(int i = 0; i < count; i++){
s += (nums[i] - average)*(nums[i] - average);
}
s /= count;
printf("%d", s);
}
672
#include <stdio.h>
#include <math.h>
double getAt(int index, double x){
double a = pow(x, index*2-1.0);
double b = 1;
for(int i = 2; i <= index*2-1; i++){
b *= i;
}
int sign = (index%2==0 ? -1 : 1);
return sign * a/b;
}
int main(){
int count;
double x;
scanf("%d %lf", &count, &x);
double sum = 0;
for(int i = 1; i <= count; i++){
sum += getAt(i, x);
}
printf("%.4f", sum);
}
673
#include <stdio.h>
#include <math.h>
int removeFirstDigit(int n){
if(n < 10) return 0;
int digits = (int)log10((double)n);
return n % (int)pow(10.0, (double)digits);
}
int main(){
int user;
scanf("%d", &user);
int sq = user*user;
int flag = 0;
while(sq > 0){
if(sq == user){
flag = 1;
break;
}
sq = removeFirstDigit(sq);
}
printf("%d %d",user, flag);
}
674
#include <stdio.h>
#define T1x 4
#define T1y 4
#define T2x -4
#define T2y -4
int posDistanceSqured(int x1, int y1, int x2, int y2){
return (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2);
}
int decode(int srcX, int srcY){
int code;
int d1 = posDistanceSqured(srcX, srcY, T1x, T1y);
int d2 = posDistanceSqured(srcX, srcY, T2x, T2y);
if(d1 > d2){
code = 2;
}else {
code = 1;
}
return code;
}
int main(){
int count;
int posX[20];
int posY[20];
scanf("%d", &count);
for(int i = 0; i < count; i++){
scanf("%d %d", &posX[i], &posY[i]);
}
for(int i = 0; i < count; i++){
printf("%d ", decode(posX[i], posY[i]));
}
return 0;
}
675
#include <stdio.h>
#define MAXCOUNT 30
int isTri(int a, int b, int c){
if(a+b<=c || a+c<=b || b+c<=a) return 0;
return 1;
}
int main(){
int count;
int a[MAXCOUNT];
scanf("%d", &count);
for(int i = 0; i < count; i++) scanf("%d", &a[i]);
int flag = 0;
for(int i = 2; i < count; i++){
if(isTri(a[i-2], a[i-1], a[i])) flag++;
}
printf("%d", flag);
}
676
#include <stdio.h>
#include <string.h>
#include <ctype.h>
char encode(char src){
if(islower(src)){
if(src >= 'n'){
src = src - 13;
}else{
src = src + 13;
}
}else if(isupper(src)){
if(src >= 'N'){
src = src - 13;
}else{
src = src + 13;
}
}
return src;
}
int main(){
char str[60];
fgets(str, sizeof(str), stdin);
int len = strlen(str);
for(int i = 0; i < len; i++){
str[i] = encode(str[i]);
}
puts(str);
}
677
#include <stdio.h>
double getPn(int index, double x){
if(index == 0) return 1;
if(index == 1) return x;
return (
(2*index-1)*x*getPn(index-1, x)
- (index-1)*getPn(index-2, x)
)/index;
}
int main(){
int n;
double x;
scanf("%d %lf", &n, &x);
double sum = 0;
for(int i = 1; i < n+1; i++){
sum += getPn(i, x);
}
printf("%.4f", sum);
}
680
#include <stdio.h>
#define STEP 0.0001
double fun(double a, double x){
return -x*x*x + a*x*x;
}
int main(){
double a;
scanf("%lf", &a);
double max = fun(a, 0);
for(int i = 0; i*STEP <= 10; i++){
if(fun(a, i*STEP) > max){
max = fun(a, i*STEP);
}
}
printf("%.2f", max);
}
681
#include <stdio.h>
int main(){
const int key1 = 3, key2 = 5, key3 = 7;
int len;
int a[30];
scanf("%d", &len);
for(int i = 0; i < len; i++){
scanf("%d", &a[i]);
}
int count = 0;
for(int i = 2; i < len; i++){
if(a[i-2] == key1 && a[i-1] == key2 && a[i] == key3){
count++;
}
}
printf("%d", count);
}
682
#include <stdio.h>
#include <math.h>
int isPrime(int n){
if(n == 1) return 0;
for(int i = 2; i <= n/2; i++){
if(n%i == 0){
return 0;
}
}
return 1;
}
int main(){
int n;
scanf("%d", &n);
int m = (int)pow(2.0, (double)n)-1;
int flag;
if(isPrime(m)){
flag = 1;
}else{
flag = 0;
}
printf("%d %d", m, flag);
}
683
#include <stdio.h>
int main(){
int count;
int a[30];
scanf("%d", &count);
for(int i = 0; i < count; i++){
scanf("%d", &a[i]);
}
int y[30];
//Calculate the mid first
for(int i = 1; i < count-1; i++){
y[i] = a[i-1]+a[i]+a[i+1];
y[i] /= 3;
}
//Calculate the first 1 and last 1
y[0] = y[1];
y[count-1] = y[count-2];
for (int i = 0; i < count; i++)
{
printf("%d ", y[i]);
}
}
684
#include <stdio.h>
#define MAXCOUNT 1000
double a[1001];
void logistic(double r, double x1, double* targetArray, int count){
targetArray[1] = x1;
for(int i = 2; i < count+1; i++){
targetArray[i] = r*targetArray[i-1]*(1.0-targetArray[i-1]);
}
}
int main(){
double a[MAXCOUNT+1];
int count = MAXCOUNT;
double x1, r;
scanf("%lf %lf", &x1, &r);
logistic(r, x1, a, MAXCOUNT);
int flag = 0;
double xn = a[1000];
for(int i = 2; i < MAXCOUNT+1; i++){
double d = a[i]-a[i-1];
if(d < 0.00001 && d > -0.00001){
flag = 1;
xn = a[i];
break;
}
}
printf("%.4f %d", xn, flag);
}
685
#include <stdio.h>
#include <string.h>
void rearrange(char* s){
int len = strlen(s);
for(int i = 0; i < len-1; i++){
for(int j = 0; j < len-1-i; j++){
if(s[j] > s[j+1]){
char temp = s[j];
s[j] = s[j+1];
s[j+1] = temp;
}
}
}
}
int main(){
char s[100];
fgets(s, sizeof(s), stdin);
rearrange(s);
int len = strlen(s);
for(int i = 0; i < len; i++){
if(s[i] != '*'){
printf("%c", s[i]);
}
}
}
686
#include <stdio.h>
int getSum(int num){
int sum = 0;
while(num > 0){
sum += num%10;
num /= 10;
}
return sum;
}
int main(){
int count;
int a[20];
scanf("%d", &count);
for(int i = 0; i < count; i++){
scanf("%d", &a[i]);
}
int sum = 0;
for(int i = 0; i < count; i++){
sum += getSum(a[i]);
}
int flag = sum%10;
printf("%d", flag);
}
687
#include <stdio.h>
#define MAXCOUNT 50
int main(){
int count;
int a[MAXCOUNT];
scanf("%d", &count);
for(int i = 0; i < count; i++) scanf("%d", &a[i]);
int max, min, sum;
int maxIndex, minIndex;
sum = a[0];
max = a[0];
maxIndex = 0;
min = a[0];
minIndex = 0;
for(int i = 1; i < count; i++){
sum += a[i];
if(a[i] > max){
max = a[i];
maxIndex = i;
}
if(a[i] < min){
min = a[i];
minIndex = i;
}
}
printf("%d %d %d %d %d", sum, max, maxIndex+1, min, minIndex+1);
}
688
#include <stdio.h>
#define MAXCOUNT 1000
void sort(int* array, int count){
for(int i = 0; i < count-1; i++){
for(int j = 0; j < count-1-i; j++){
if(array[j] > array[j+1]){
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
}
int main(){
int count;
int a[MAXCOUNT];
scanf("%d", &count);
for(int i = 0; i < count; i++) scanf("%d", &a[i]);
sort(a, count);
int maxRepeat = 0;
int num = a[0];
int repeat = 1;
for(int i = 1; i < count; i++){
if(a[i] == a[i-1]){
repeat++;
}else if(repeat > maxRepeat){
maxRepeat = repeat;
num = a[i-1];
repeat = 1;
}
}
printf("%d",num);
}
689
#include <stdio.h>
#include <string.h>
void subString(const char *src, int start, int end, char *result) {
int length = strlen(src);
int j = 0;
for (int i = start; i <= end; i++) {
result[j++] = src[i];
}
result[j] = '\0';
}
int compareStr(char* s1, char* s2){
int len1 = strlen(s1);
int len2 = strlen(s2);
int flag = 1;
for(int i = 0; i < len1 && i < len2; i++){
if(s1[i] != s2[i]){
flag = 0;
break;
}
}
return flag;
}
int main(){
char tar[4];
char src[51];
scanf("%s", tar);
scanf("%s", src);
int tarLen = strlen(tar);
int srcLen = strlen(src);
int repeat = 0;
for(int i = 0; i <= srcLen-tarLen; i++){
char sub[4];
subString(src, i, i+tarLen-1, sub);
if(compareStr(tar, sub)) repeat++;
}
printf("%d", repeat);
}
690
#include <stdio.h>
int main(){
int a;
scanf("%d", &a);
int b = a*a;
int countOddNumber=0;
int countEvenNumber=0;
int countSpecialNumber=0;
for(int i = a; i <= b; i++){
if(i%2)countOddNumber++;
else countEvenNumber++;
if(i%4==0 && i%3!=0) countSpecialNumber++;
}
int s1 = countOddNumber+countEvenNumber;
int s2 = countEvenNumber+countSpecialNumber;
int s3 = countSpecialNumber+countOddNumber;
int max = (s1 > s2 ? s1 : s2) > s3 ? (s1 > s2 ? s1 : s2) : s3;
printf("%d %d %d", countOddNumber, countEvenNumber, countSpecialNumber);
printf("\n%d", max);
}
691
#include <stdio.h>
#define MAXCOUNT 30
int main(){
int count;
int a[MAXCOUNT];
scanf("%d", &count);
for(int i = 0; i < count; i++) scanf("%d", &a[i]);
int d = count/2 + count%2;
for(int i = 0; i < count/2; i++){
int j = d + i;
//swap i & count-1-i
a[i] ^= a[j];
a[j] ^= a[i];
a[i] ^= a[j];
}
for(int i = 0; i < count; i++){
printf("%d ", a[i]);
}
}
692
#include <stdio.h>
int main(){
int a, b;
scanf("%d %d", &a, &b);
if(a > b){
a ^= b;
b ^= a;
a ^= b;
}
int count3 = 0;
int count4 = 0;
int count5n2 = 0;
for(int i = a; i <= b; i++){
if(i%3==0) count3++;
if(i%4==0) count4++;
if(i%5==0 && i%2 != 0) count5n2++;
}
int max = 0;
int x[6] = {
count3%count4,
count4%count3,
count4%count5n2,
count5n2%count4,
count5n2%count3,
count3%count5n2,
};
for(int i = 1; i < 6; i++){
if(x[i] > max) max = x[i];
}
printf("%d %d %d\n%d", count3, count4, count5n2, max);
}
693
//出题人水平有待提高
#include <stdio.h>
#define MAXCOUNT 30
void sort(int* tar, int count){
for(int i = 0; i < count-1; i++){
for(int j = 0; j < count-1-i; j++){
if(tar[j] > tar[j+1]){
tar[j] ^= tar[j+1];
tar[j+1] ^= tar[j];
tar[j] ^= tar[j+1];
}
}
}
}
int main(){
int count;
int a[MAXCOUNT];
scanf("%d", &count);
for(int i = 0; i < count; i++) scanf("%d", &a[i]);
scanf("%d", &a[count]);
count++;
sort(a, count);
for(int i = 0; i < count; i++){
printf("%d ", a[i]);
}
}
694
#include <stdio.h>
int fun(int n){
if(n == 1) return 2;
if(n == 2) return 3;
return (n-1)*(n-1)+3*(n-2)+1;
}
int main(){
int m, k;
scanf("%d %d", &m, &k);
int count0 = 0;
int count1 = 0;
int count2 = 0;
for(int i = 1; i <= k; i++){
int a = fun(i);
if(a%m == 0) count0++;
else if(a%m == 1) count1++;
else count2++;
}
printf("%d %d %d", count0, count1, count2);
}
695
//没活可以咬打火机
#include <stdio.h>
#define MAXCOUNT 101
void swap(int* a, int* b){
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
void sortWithIndex(int* array, int* index, int count){
for(int i = 0; i < count-1; i++){
for(int j = 0; j < count-1-i; j++){
if(array[j] > array[j+1]){
swap(&array[j], &array[j+1]);
swap(&index[j], &index[j+1]);
}
}
}
}
int main(){
int count;
int array[MAXCOUNT];
scanf("%d", &count);
for(int i = 0; i < count; i++) scanf("%d", &array[i]);
int index[MAXCOUNT];
for(int i = 0; i < count; i++) index[i] = i+1;
sortWithIndex(array, index, count);
int deltaMax = array[1] - array[0];
int deltaMin = array[1] - array[0];
for(int i = 2; i < count; i++){
int delta = array[i]-array[i-1];
if(delta > deltaMax){
deltaMax = delta;
}else if(delta < deltaMin){
deltaMin = delta;
}
}
if(deltaMax == deltaMin){
for(int i = 0; i < count; i++) printf("%d ", index[i]);
}else{
printf("%d %d", deltaMax, deltaMin);
}
}
696
#include <stdio.h>
#define MAXCOUNT 20
void swap(int* a, int* b){
if(*a == *b) return;
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
int main(){
int count;
int a[MAXCOUNT];
scanf("%d", &count);
for(int i = 0; i < count; i++) scanf("%d", &a[i]);
int indexMax = 0, indexMin = 0;
//Part 1: Find min
for(int i = 1; i < count; i++){
if(a[i] < a[indexMin]) indexMin = i;
}
swap(&a[0], &a[indexMin]);
//Part 2: Find max
for(int i = 1; i < count; i++){
if(a[i] > a[indexMax]) indexMax = i;
}
swap(&a[count-1], &a[indexMax]);
for(int i = 0; i < count; i++) printf("%d ", a[i]);
}
697
#include <stdio.h>
int main(){
double mile;
int minute;
scanf("%lf %d", &mile, &minute);
double money;
if(mile <= 3) money = 10.0;
else if(mile <= 10) money = 10.0 + (mile-3.0) * 2.0;
else money = 10.0 + 14.0 + (mile-10.0) * 3.0;
money += (minute/5)*2;
printf("%.1f", money);
}
698
#include <stdio.h>
#define MAXCOUNT 100
/**
* Append 'n' into 'array' per digit
* 'n' is less than 99
*/
void appendByDigit(int* array, int* len, int n){
if(n >= 10){
array[*len] = n / 10;
(*len)++;
array[*len] = n % 10;
(*len)++;
}else{
array[*len] = n;
(*len)++;
}
}
int main(){
int a[MAXCOUNT];
int len;
int a1, a2, n;
scanf("%d %d %d", &a1, &a2, &n);
a[0] = a1;
a[1] = a2;
len = 2;
for(int i = 1; i < n; i++){
int muti = a[i-1] * a[i];
appendByDigit(a, &len, muti);
}
for(int i = 0; i < n; i++){
printf("%d ", a[i]);
}
}
699
#include <stdio.h>
#define MAXCOUNT 30
int main(){
int count, chief;
int a[MAXCOUNT];
scanf("%d %d", &count, &chief);
for(int i = 0; i < count; i++) scanf("%d", &a[i]);
int sum = 0;
for(int i = 0; i < count; i++) sum += a[i];
int chiefScore = a[chief-1];
int validCount = count;
int max = a[0];
int min = a[0];
for(int i = 0; i < count; i++){
if(a[i] > max) max = a[i];
else if(a[i] < min) min = a[i];
}
if(chiefScore != max){
sum -= max;
validCount--;
}
if(chiefScore != min){
sum -= min;
validCount--;
}
/* for(int i = 0; i < count; i++){
if(a[i] == max && a[i] != chiefScore){
sum -= max;
validCount--;
}else if(a[i] == min && a[i] != chiefScore){
sum -= min;
validCount--;
}
} */
double average = (double) sum / validCount;
printf("%.2f", average);
}
700
#include <stdio.h>
int main(){
int sumOdd = 0;
int sumEven = 0;
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i++){
if(i%2==0) sumEven += i;
else sumOdd += i;
}
printf("%d %d", sumOdd, sumEven);
}
701
#include <stdio.h>
#include <math.h>
#define MAXCOUNT 101
int main(){
int count;
double a[MAXCOUNT];
scanf("%d", &count);
for(int i = 0; i < count; i++) scanf("%lf", &a[i]);
//calc average
double average = 0;
for(int i = 0; i < count; i++){
average += a[i];
}
average /= count;
//calc s
double s = 0;
for(int i = 0; i < count; i++){
s += (a[i] - average)*(a[i] - average);
}
s = sqrt(s/(count-1));
int exceptions = 0;
for(int i = 0; i < count; i++){
if(a[i] < average-3*s || a[i] > average+3*s){
exceptions++;
}
}
printf("%.4f %d", s, exceptions);
}
702
#include <stdio.h>
#define MAXCOUNT 1000
int main(){
int count;
int a[MAXCOUNT];
scanf("%d", &count);
for(int i = 0; i < count; i++) scanf("%d", &a[i]);
int maxCount = 0;
int maxCountNum;
//Append -1 to 'a' to revise the logic
a[count++] = -1;
int tempCount = 1;
int tempCountNum = a[0];
for(int i = 1; i < count; i++){
if(a[i] == tempCountNum) tempCount++;
else{
if(tempCount > maxCount){
maxCount = tempCount;
maxCountNum = tempCountNum;
}
tempCount = 1;
tempCountNum = a[i];
}
}
printf("%d", maxCount);
}
703
#include <stdio.h>
#define MAXCOUNT 100
int get(int a, int b){
for(int i = a; i > 0; i++){
if(i >= b && i%a==0 && i%b==0) return i;
}
}
int main(){
int count;
int a[MAXCOUNT];
scanf("%d", &count);
for(int i = 0; i < count; i++) scanf("%d", &a[i]);
int sum = 0;
for(int i = 1; i < count; i++){
sum += get(a[i-1], a[i]);
}
printf("%d", sum);
}
704
#include <stdio.h>
#include <string.h>
int hex(char c){
int bin = -1;
if(c >= '0' && c <= '9') bin = c - '0';
else switch (c){
case 'A':
case 'a':
bin = 10;
break;
case 'B':
case 'b':
bin = 11;
break;
case 'C':
case 'c':
bin = 12;
break;
case 'D':
case 'd':
bin = 13;
break;
case 'E':
case 'e':
bin = 14;
break;
case 'F':
case 'f':
bin = 15;
break;
}
return bin;
}
int main(){
char str[50];
scanf("%s", str);
int len = strlen(str);
int sum = 0;
int flag = 0;
for(int i = 0; i < len; i++){
if(hex(str[i]) != -1){
sum += hex(str[i]);
flag = 1;
}
}
if(flag == 1){
printf("%d", sum);
}else{
printf("NO");
}
}
705
#include <stdio.h>
int main(){
int len;
int a[64];
int foldCount;
int originLenPower;
scanf("%d %d", &originLenPower, &foldCount);
//Calculate the value of `len` from `originLenPower`
len = 1;
for(int i = 0; i < originLenPower; i++){
len *= 2;
}
//sser input part
for(int i = 0; i < len; i++){
scanf("%d", &a[i]);
}
//Control the count of fold by `foldCount`
for(int i = 0; i < foldCount; i++){
//A Fold
for(int index = 0; index < len/2; index++){
a[index] = a[index] + a[len-1 - index];
}
len /= 2;
}
for(int i = 0; i < len; i++){
printf("%d ", a[i]);
}
}
706
#include <stdio.h>
#include <string.h>
int main(){
char s1[20];
char s2[20];
int index;
scanf("%s %s %d", s1, s2, &index);
int len1 = strlen(s1);
int len2 = strlen(s2);
for(int i = 0; i < len1+1; i++){
if(i == index) printf("%s", s2);
putchar(s1[i]);
}
}
707
#include <stdio.h>
#include <string.h>
int isSubString(char* s1, char* s2){
int len1 = strlen(s1);
int len2 = strlen(s2);
if(len1 != len2) return 0;
for(int i = 0; i < len1; i++){
if(s1[i] != s2[i]) return 0;
}
return 1;
}
void subString(const char *src, int start, int end, char *result) {
int length = strlen(src);
int j = 0;
for (int i = start; i <= end; i++) {
result[j++] = src[i];
}
result[j] = '\0';
}
int main(){
char src[20];
char tar[20];
fgets(src, sizeof src, stdin);
fgets(tar, sizeof tar, stdin);
int len1 = strlen(src);
int len2 = strlen(tar);
//for '\n' by 'fgets()'
src[--len1] = '\0';
tar[--len2] = '\0';
int index = -1;
for(int i = 0; i <= len1-len2; i++){
char nowString[20];
subString(src, i, i+len2-1, nowString);
if(isSubString(nowString, tar)) index = i+1;
}
if(index == -1) printf("No!");
else printf("%d", index);
}
708
#include <stdio.h>
int f(int n){
return 3*(n-1)*(n-1)+2*(n-1)+1;
}
int main(){
int sumOdd = 0;
int sumEven = 0;
int count;
scanf("%d", &count);
for(int i = 1, calced = 0; calced < count; i++){
if(f(i) > 100 && f(i) % 2 == 0){
sumEven += f(i);
calced++;
}
}
for(int i = 1, calced = 0; calced < count-1; i++){
if(f(i) > 100 && f(i) % 2 == 1){
sumOdd += f(i);
calced++;
}
}
printf("%d %d", sumEven, sumOdd);
}