C语言-杭州电子科技大学OJ
声明
题目摘自杭州电子科技大学OJ
答案来自CSDN@不编程智科猿
ASCII码排序
Q
Problem Description
输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符。
Input
输入数据有多组,每组占一行,有三个字符组成,之间无空格。
Output
对于每组输入数据,输出一行,字符中间用一个空格分开。
Sample Input
qwe
asd
zxc
Sample Output
e q w
a d s
c x z
A
#include <stdio.h>
#include <string.h>
int main()
{
char s[3];
while(scanf("%s", s) != EOF)
{
// 排序
for(int i=0; i<2; i++)
{
for(int j=i+1; j<3; j++)
{
if(s[i] > s[j])
{
char temp = s[i];
s[i] = s[j];
s[j] = temp;
}
}
}
// 输出结果
printf("%c %c %c\n", s[0], s[1], s[2]);
}
return 0;
}
计算两点间的距离
Q
Problem Description
输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离。
Input
输入数据有多组,每组占一行,由4个实数组成,分别表示x1,y1,x2,y2,数据之间用空格隔开。
Output
对于每组输入数据,输出一行,结果保留两位小数。
Sample Input
0 0 0 1
0 1 1 0
Sample Output
1.00
1.41
A
#include <stdio.h>
#include <math.h>
int main()
{
double x1, y1, x2, y2, distance;
while(scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2) != EOF)
{
// 计算距离
distance = sqrt(pow(x2-x1, 2) + pow(y2-y1, 2));
// 输出
printf("%.2lf\n", distance);
}
return 0;
}
计算球体积
Q
Problem Description
根据输入的半径值,计算球的体积。
Input
输入数据有多组,每组占一行,每行包括一个实数,表示球的半径。
Output
输出对应的球的体积,对于每组输入数据,输出一行,计算结果保留三位小数。
Sample Input
1
1.5
Sample Output
4.189
14.137
Hint
#define PI 3.1415927
A
#include <stdio.h>
#define PI 3.1415927
int main()
{
double r, v;
while(scanf("%lf", &r) != EOF)
{
// 计算球的体积
v = 4.0 / 3.0 * PI * r * r * r;
// 输出结果
printf("%.3lf\n", v);
}
return 0;
}
求绝对值
Q
Problem Description
求实数的绝对值。
Input
输入数据有多组,每组占一行,每行包含一个实数。
Output
对于每组输入数据,输出它的绝对值,要求每组数据输出一行,结果保留两位小数。
Sample Input
123
-234.00
Sample Output
123.00
234.00
A
#include <stdio.h>
#include <math.h>
int main()
{
double x, y;
while(scanf("%lf", &x) != EOF)
{
// 计算绝对值
y = fabs(x);
// 输出结果
printf("%.2lf\n", y);
}
return 0;
}
成绩转换
Q
Problem Description
输入一个百分制的成绩t,将其转换成对应的等级,具体转换规则如下:
90~100为A;
80~89为B;
70~79为C;
60~69为D;
0~59为E;
Input
输入数据有多组,每组占一行,由一个整数组成。
Output
对于每组输入数据,输出一行。如果输入数据不在0~100范围内,请输出一行:“Score is error!”。
Sample Input
56
67
100
123
Sample Output
E
D
A
Score is error!
A
#include <stdio.h>
int main()
{
int t;
while(scanf("%d", &t) != EOF)
{
if(t >= 0 && t <= 100)
{
// 根据成绩等级输出
if(t >= 90)
printf("A\n");
else if(t >= 80)
printf("B\n");
else if(t >= 70)
printf("C\n");
else if(t >= 60)
printf("D\n");
else
printf("E\n");
}
else
{
// 成绩不合法
printf("Score is error!\n");
}
}
return 0;
}
第几天?
Q
Problem Description
给定一个日期,输出这个日期是该年的第几天。
Input
输入数据有多组,每组占一行,数据格式为YYYY/MM/DD组成,具体参见sample input ,另外,可以向你确保所有的输入数据是合法的。
Output
对于每组输入数据,输出一行,表示该日期是该年的第几天。
Sample Input
1985/1/20
2006/3/12
Sample Output
20
71
A
#include <stdio.h>
int main()
{
int y, m, d;
while(scanf("%d/%d/%d", &y, &m, &d) != EOF)
{
// 公历每个月份对应的天数
int month[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int sum = 0; // 记录天数总和
for(int i=1; i<m; i++)
{
sum += month[i];
}
sum += d; // 加上当月天数
if((y%4==0&&y%100!=0) || (y%400==0)) // 判断是否为闰年
{
if(m > 2)
sum++;
}
// 输出结果
printf("%d\n", sum);
}
return 0;
}
求奇数的乘积
Q
Problem Description
给你n个整数,求他们中所有奇数的乘积。
Input
输入数据包含多个测试实例,每个测试实例占一行,每行的第一个数为n,表示本组数据一共有n个,接着是n个整数,你可以假设每组数据必定至少存在一个奇数。
Output
输出每组数中的所有奇数的乘积,对于测试实例,输出一行。
Sample Input
3 1 2 3
4 2 3 4 5
Sample Output
3
15
A
#include <stdio.h>
int main()
{
int n, x;
while(scanf("%d", &n) != EOF)
{
int p = 1; // 记录奇数的乘积
for(int i=0; i<n; i++)
{
scanf("%d", &x);
if(x % 2 == 1) // 判断是否为奇数
{
p *= x;
}
}
// 输出结果
printf("%d\n", p);
}
return 0;
}
平方和与立方和
Q
Problem Description
给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和。
Input
输入数据包含多组测试实例,每组测试实例包含一行,由两个整数m和n组成。
Output
对于每组输入数据,输出一行,应包括两个整数x和y,分别表示该段连续的整数中所有偶数的平方和以及所有奇数的立方和。
你可以认为32位整数足以保存结果。
Sample Input
1 3
2 5
Sample Output
4 28
20 152
A
#include <stdio.h>
int main()
{
int m, n, evenSum, oddSum;
while(scanf("%d%d", &m, &n) != EOF)
{
evenSum = oddSum = 0;
// 循环计算
for(int i=m; i<=n; i++)
{
if(i % 2 == 0) // 偶数
{
evenSum += i*i;
}
else // 奇数
{
oddSum += i*i*i;
}
}
// 输出结果
printf("%d %d\n", evenSum, oddSum);
}
return 0;
}
数值统计
Q
Problem Description
统计给定的n个数中,负数、零和正数的个数。
Input
输入数据有多组,每组占一行,每行的第一个数是整数n(n<100),表示需要统计的数值的个数,然后是n个实数;如果n=0,则表示输入结束,该行不做处理。
Output
对于每组输入数据,输出一行a,b和c,分别表示给定的数据中负数、零和正数的个数。
Sample Input
6 0 1 2 3 -1 0
5 1 2 3 4 0.5
0
Sample Output
1 2 3
0 0 5
A
#include <stdio.h>
int main()
{
int n;
while(scanf("%d", &n) != EOF && n != 0)
{
int n1 = 0, n2 = 0, n3 = 0; // 记录负数、零和正数的个数
double x;
for(int i=0; i<n; i++)
{
scanf("%lf", &x);
if(x < 0)
n1++;
else if(x == 0)
n2++;
else
n3++;
}
// 输出结果
printf("%d %d %d\n", n1, n2, n3);
}
return 0;
}
求数列的和
Q
Problem Description
数列的定义如下:
数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和。
Input
输入数据有多组,每组占一行,由两个整数n(n<10000)和m(m<1000)组成,n和m的含义如前所述。
Output
对于每组输入数据,输出该数列的和,每个测试实例占一行,要求精度保留2位小数。
Sample Input
81 4
2 2
Sample Output
94.73
3.41
A
#include <stdio.h>
#include <math.h>
int main()
{
double n, m;
while(scanf("%lf%lf", &n, &m) != EOF)
{
double sum = n; // 记录数列的和
double x = n;
for(int i=1; i<m; i++)
{
x = sqrt(x); // 计算平方根
sum += x; // 累加到总和
}
// 输出结果
printf("%.2lf\n", sum);
}
return 0;
}
水仙花数
Q
Problem Description
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3。
现在要求输出所有在m和n范围内的水仙花数。
Input
输入数据有多组,每组占一行,包括两个整数m和n(100<=m<=n<=999)。
Output
对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;
如果给定的范围内不存在水仙花数,则输出no;
每个测试实例的输出占一行。
Sample Input
100 120
300 380
Sample Output
no
370 371
A
#include <stdio.h>
#include <math.h>
int main()
{
int m, n;
while(scanf("%d%d", &m, &n) != EOF)
{
int hasSolution = 0; // 是否存在水仙花数的标志
for(int i=m; i<=n; i++)
{
int a = i / 100; // 百位
int b = i / 10 % 10; // 十位
int c = i % 10; // 个位
if(i == a*a*a + b*b*b + c*c*c) // 判断是否为水仙花数
{
printf("%d ", i);
hasSolution = 1;
}
}
// 输出结果
if(!hasSolution) // 不存在水仙花数
{
printf("no");
}
printf("\n");
}
return 0;
}
多项式求和
Q
Problem Description
多项式的描述如下:
1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + ...
现在请你求出该多项式的前n项的和。
Input
输入数据由2行组成,首先是一个正整数m(m<100),表示测试实例的个数,第二行包含m个正整数,对于每一个整数(不妨设为n,n<1000),求该多项式的前n项的和。
Output
对于每个测试实例n,要求输出多项式前n项的和。每个测试实例的输出占一行,结果保留2位小数。
Sample Input
2
1 2
Sample Output
1.00
0.50
A
#include <stdio.h>
int main()
{
int m;
scanf("%d", &m);
while(m--)
{
int n;
scanf("%d", &n);
double sum = 1; // 多项式的和
int flag = -1; // 正负项的标志
for(int i=2; i<=n; i++)
{
sum += flag * 1.0 / i; // 累加每一项
flag = -flag; // 更改正负项
}
// 输出结果
printf("%.2lf\n", sum);
}
return 0;
}
素数判定
Q
Problem Description
对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<y<=50),判定该表达式的值是否都为素数。
Input
输入数据有多组,每组占一行,由两个整数x,y组成,当x=0,y=0时,表示输入结束,该行不做处理。
Output
对于每个给定范围内的取值,如果表达式的值都为素数,则输出"OK",否则请输出“Sorry”,每组输出占一行。
Sample Input
0 1
0 0
Sample Output
OK
A
#include <stdio.h>
#include <math.h>
int is_prime(int x)
{
if(x < 2) // 小于2不是素数
return 0;
int max_div = sqrt(x); // 只需遍历到平方根即可
for(int i=2; i<=max_div; i++)
{
if(x % i == 0)
return 0;
}
return 1;
}
int main()
{
int x, y;
while(scanf("%d%d", &x, &y) != EOF && x != 0 && y != 0)
{
int all_prime = 1; // 是否都为素数的标志
for(int i=x; i<=y; i++)
{
int num = i * i + i + 41;
if(!is_prime(num)) // 如果当前值不为素数
{
all_prime = 0; // 则标志为否
break;
}
}
// 输出结果
if(all_prime)
printf("OK\n");
else
printf("Sorry\n");
}
return 0;
}
蟠桃记
Q
Problem Description
喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:悟空是在研究一个数学问题!
什么问题?他研究的问题是蟠桃一共有多少个!
不过,到最后,他还是没能解决这个难题,呵呵^-^
当时的情况是这样的:
第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?
Input
输入数据有多组,每组占一行,包含一个正整数n(1<n<30),表示只剩下一个桃子的时候是在第n天发生的。
Output
对于每组输入数据,输出第一天开始吃的时候桃子的总数,每个测试实例占一行。
Sample Input
2
4
Sample Output
4
22
A
#include <stdio.h>
int main()
{
int n;
while(scanf("%d", &n) != EOF)
{
int sum = 1;
for(int i=1; i<n; i++)
{
sum = (sum + 1) * 2; // 计算每一天的剩余桃子数
}
// 输出结果
printf("%d\n", sum);
}
return 0;
}
青年歌手大奖赛_评委会打分
Q
Problem Description
青年歌手大奖赛中,评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分。
Input
输入数据有多组,每组占一行,每行的第一个数是n(2<n<=100),表示评委的人数,然后是n个评委的打分。
Output
对于每组输入数据,输出选手的得分,结果保留2位小数,每组输出占一行。
Sample Input
3 99 98 97
4 100 99 98 97
Sample Output
98.00
98.50
A
#include <stdio.h>
#include <stdlib.h>
// 按升序排序
int cmp(const void *a, const void *b)
{
return *(int *)a - *(int *)b;
}
int main()
{
int n, score[100];
while(scanf("%d", &n) != EOF)
{
// 读入评委的打分
for(int i=0; i<n; i++)
{
scanf("%d", &score[i]);
}
// 排序
qsort(score, n, sizeof(int), cmp);
// 去掉最高分和最低分
int sum = 0;
for(int i=1; i<n-1; i++) // 注意不要越界
{
sum += score[i];
}
double avg = sum * 1.0 / (n-2);
// 输出结果
printf("%.2lf\n", avg);
}
return 0;
}
偶数求和
Q
Problem Description
有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。编程输出该平均值序列。
Input
输入数据有多组,每组占一行,包含两个正整数n和m,n和m的含义如上所述。
Output
对于每组输入数据,输出一个平均值序列,每组输出占一行。
Sample Input
3 2
4 2
Sample Output
3 6
3 7
先停一段时间
A
数据的交换输出
Q
A
字符串统计
Q
A
母牛的故事
Q
A
数列有序!
Q
A
绝对值排序
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A
****
Q
A