在线自动判题系统练习题集
在线自动判题系统网址http://acmoj.shu.edu.cn。用学号登录(初始密码同学号),进入“比赛”,第254号比赛。其中第01-05题为例题,第06-10题为练习题。所有10道题目都必须提交,其提交情况也作为本练习排名的依据,亦即作为本课程成绩的依据之一。
00 计算两个整数的和
问题描述 给定两个整数,计算它们的和。
输入 输入数据有若干行。每行上有两个整数,对应一种情形。
输出 对于每一种情形,先输出“Case #: ”(#为序号,从1起),然后输出算式和结果。
输入样例
98 72
-40 88
-62 -95
输出样例
Case 1: 98 + 72 = 170
Case 2: -40 + 88 = 48
Case 3: -62 - 95 = -157
01 阶乘尾部0的个数
问题描述 给定非负整数n,计算n的阶乘尾部0的个数。
输入 输入数据有若干行。每行上有一个正整数n,对应一种情形。
输出 对于每一种情形,先输出“Case #: ”(#为序号,从1起),然后输出n的值,逗号,结果,换行。
输入样例
8
16
30
输出样例
Case 1: 8, 1
Case 2: 16, 3
Case 3: 30, 7
#include <stdio.h>
int main()
{
long long int n;
long long int i = 0;
while (scanf("%d",&n) == 1 )
{
long long int count = 0;
long long int num = n;
while(n>=5)
{
count += n/5;
n /= 5;
}
printf("Case %d: %d, %d\n",++i,num,count);
}
return 0;
}
02 判断算式的正确性
问题描述 给定一个算式,该算式中只含一个四则运算符号,操作数及结果均为整数。要求判断该算式的正确性(规定:除法必须除尽才算正确)。
输入 输入数据有若干行。每行上有一个算式,对应一种情形。
输出 对于每一种情形,先输出“Case #: ”(#为序号,从1起),然后输出结果(Yes或No),换行。
输入样例
1 + 2 = -3
5 / 2 = 2
4 / 2 = 2
输出样例
Case 1: No
Case 2: No
Case 3: Yes
#include <stdio.h>
#include <time.h>
int main()
{
int a[3];
char c[2];
int i = 0;
char m;
while (scanf("%d %c %d %c %d", &a[0], &c[0], &a[1], &c[1], &a[2]) == 5)
{
if (c[0] == '+')
{
if (a[0] + a[1] == a[2])
printf("Case %d: Yes\n", ++i);
else
printf("Case %d: No\n", ++i);
}
else if (c[0] == '*')
{
if (a[0] * a[1] == a[2])
printf("Case %d: Yes\n", ++i);
else
printf("Case %d: No\n", ++i);
}
else if (c[0] == '/')
{
if (a[1] != 0)
{
if ((float)a[0] / (float)a[1] == (float)a[2])
printf("Case %d: Yes\n", ++i);
else
printf("Case %d: No\n", ++i);
}
else
printf("Case %d: No\n", ++i);
}
else if (c[0] == '-')
{
if (a[0] - a[1] == a[2])
printf("Case %d: Yes\n", ++i);
else
printf("Case %d: No\n", ++i);
}
}
return 0;
}
03 求给定的n个实数中的最大值
问题描述 给定正整数n及n个实数,找出其中的最大值。
输入 输入数据有若干行。每行上第一个数为正整数n,紧接其后有n个实数,对应一种情形,数据之间用空格分隔。
输出 对于每一种情形,先输出“Case #: ”(#为序号,从1起,冒号后输出一个空格),然后输出计算结果(保留1位小数),最后换行。
输入样例
3
1.0 3.0 2.0
5
10.0 8.5 15.3 7.8 5.8
1
3.3
输出样例
Case 1: 3.0
Case 2: 15.3
Case 3: 3.3
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int n;
float a[1000];
for(int num = 1;n != '\n';num++)
{
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
float maximum = a[0];
for (int j = 0; j < n; j++)
{
if (a[j] > maximum)
maximum = a[j];
}
cout << "Case " << num << ": ";
cout << fixed << setprecision(1) << maximum << "\n";
}
cout<<endl;
}
#include <stdio.h>
int main()
{
int n;
float a[1000];
int num = 1;
while (scanf("%d", &n) == 1)
{
for (int i = 0; i < n; i++)
scanf("%f", &a[i]);
float maximum = a[0];
for (int j = 0; j < n; j++)
{
if (a[j] > maximum)
maximum = a[j];
}
printf("Case %d: %.1f\n", num, maximum);
num++;
}
return 0;
}
04 计算若干个整数的和
问题描述 对于给定的若干个整数,要求计算它们的项数及和。
输入 输入数据有多行。每一行有若干个整数(个数不超过1024. C++程序不受此限制),希望计算它们的项数及总和。
输出 对于每一行中的数据,要求先输出“Case #: ”(#为序号从1起,冒号后输出一个空格),然后输出该行上数据的个数、逗号、空格、总和、换行。
输入样例
15 3 42 89
51 201 303 9 755 800
输出样例
Case 1: 4, 149
Case 2: 6, 2119
#include<stdio.h>
int main()
{
int a[100];
int j = 0;
while(scanf("%d",&a[0]) == 1)
{
int sum = a[0];
int i = 1;
while(getchar() != '\n')
{
scanf("%d",&a[i]);
sum+=a[i];
i++;
}
printf("Case %d: %d, %d\n",++j,i,sum);
}
return 0;
}
05 态度决定一切
问题描述 将英文26个字母A~Z,或a~z对应到整数1~26,则态度 Attitude 对应的数字之和为100。编程计算给定的字符串对应的数字之和(规定非英文字母的字符均对应0)。
输入 输入数据的第一行为一个整数n,其后共有n行字符串(字符串的长度不超过1000)分别表示n种情形。
输出 对于每一种情况,要求先输出“Case #: ”(#为序号,从1起,冒号后输出一个空格),然后输出原字符串、空格、等号、空格、结果、换行。
输入样例
3
attitude
Hard Work
knowledge
输出样例
Case 1: attitude = 100
Case 2: Hard Work = 98
Case 3: knowledge = 96
#include <stdio.h>
#include <string.h>
int main()
{
int n;
char str[100];
int sum,counts =0;
scanf("%d",&n);
gets(str);
for (int i = 0;i < n;i++)
{
sum = 0;
gets(str);
for (int j = 0;str[j] != '\0';j++)
{
if(str[j] >='a' && str[j] <= 'z')
sum += str[j] - 'a' + 1;
else if(str[j] >= 'A' && str[j] <= 'Z')
sum += str[j] - 'A' + 1;
}
printf("Case %d: %s = %d\n",++counts,str,sum);
}
return 0;
}
06 二维平面上过圆点直线与x轴的夹角
问题描述 给定平面坐标系XOY上的一个点P(x, y),计算从x轴正向与OP之间的夹角。
输入 输入数据有若干行。每行上有两个浮点型数据,对应一种情形。
输出 对于每一种情形,先输出"Case #: "(#为序号,从1起),然后输出结果。注意结果应该在区间[-180°, 180°]中(保留2位小数)。
输入样例
1 0
-1 1
-1 -1
0 -1
输出样例
Case 1: 0.00
Case 2: 135.00
Case 3: -135.00
Case 4: -90.00
#include<stdio.h>
#include<math.h>
int main(){
float x,y;
int n,t;
n=1;
while(scanf("%f %f",&x,&y)==2){
printf("Case %d: %.2f\n",n,atan2(y,x)*180.0/3.1415926);
n++;
}
return 0;
}
07 算术平均数及几何平均数
问题描述 给定一系列双精度浮点型数据,计算其项数、算术平均数和几何平均数。
输入 输入数据有若干行。每行上有若干个(不超过20个)双精度浮点型数据,对应一种情形。
输出 对于每一种情形,先输出"Case #: "(#为序号,从1起),然后参照输出样例输出数据的项数、算术平均数、几何平均数(保留2位小数)。
输入样例
-1 2 -3 4 -5
-1 2 -3 4
-1 2 3 4
输出样例
Case 1: (5), -0.60, -2.61
Case 2: (4), 0.50, 2.21
Case 3: (4), 2.00, none
#include <stdio.h>
#include <math.h>
double ave_numeric(double sum, int n)
{
return (double)(sum/n);
}
void ave_geometric(double prod, int n)
{
if(prod < 0 && (n == 0 || n%2 != 0))
printf("%.2lf\n",-(double)pow(-prod, 1.00/n));
else if (prod < 0 && (n != 0 && n%2 == 0))
printf("none\n");
else printf("%.2lf\n",(double)pow(prod, 1.00/n));
}
int main()
{
double a[20];
int i = 0,j , m = 1;
while (scanf("%lf",&a[i]) == 1)
{
int flag = 1;
double sum = a[0], prod = a[0];
if(getchar() == '\n')
{
j = 1;
printf("Case %d: (%d), %.2lf, ",m++,j, ave_numeric(sum,j));
ave_geometric(prod,j);
}
else
{
for (j = 1;flag && scanf("%lf",&a[j]) == 1;j++)
{
sum += a[j];
prod = prod * a[j];
if(getchar() == '\n')
flag = 0;
}
printf("Case %d: (%d), %.2lf, ",m++,j, ave_numeric(sum,j));
ave_geometric(prod,j);
}
}
return 0;
}
08 计算和式
问题描述 用记号[dd]表示2位十进制数d×10+d;[ddd]表示3位十进制数d×100+d×10+d;以此类推。给定0~9之间的一个数码d,以及一个正整数n,计算不超过n项的和式d+[dd]+[ddd]+…+[d…d],要求计算过程用long long数据类型且不发生溢出。例如:d为1,n为5时,计算1+11+111+1111+11111,结果为12345,其中实际求和项数为5。注意:如下测试样例3中,n为100,实际求和项数为19。
输入 输入数据有若干行,每行上有两个数据分别表示d和n,对应一种情形。
输出 参照输出样例输出结果。请注意①输出的s(d, m)中m是实际求和的项数;②冒号和逗号后、等号前后都有一个空格字符。
输入样例
1 9
1 19
1 100
输出样例
Case 1: s(1, 9) = 123456789
Case 2: s(1, 19) = 1234567901234567899
Case 3: s(1, 19) = 1234567901234567899
【提示】因为一些编译系统采用宏符号Long_Long_MAX,而另一些编译系统采用宏符号LLONG_MAX表示扩展的长整型(long long)数据的最大值。为了兼容不同编译系统,请参考如下代码
C语言
#include <stdio.h>
#include <limits.h>
#ifndef LONG_LONG_MAX
#define LONG_LONG_MAX LLONG_MAX
#define ULONG_LONG_MAX ULLONG_MAX
#endif
C++
#include <iostream>
#include <climits>
using namespace std;
#ifndef LONG_LONG_MAX
#define LONG_LONG_MAX LLONG_MAX
#define ULONG_LONG_MAX ULLONG_MAX
#endif
#include <stdio.h>
#include <limits.h>
#define LONG_LONG_MAX LLONG_MAX
int main()
{
// 定义变量
int i, j, k;
int d, m, n, tmp;
int a[25];
j = 1;
// 循环读入输入
while (scanf("%d %d", &d, &n) == 2)
{
// 处理特殊情况:d为0的情况
if (d == 0)
{
printf("Case %d: s(0, %d) = 0\n", j, n);
}
else
{
// 初始化a数组为0
for (k = 0; k < 25; k++)
{
a[k] = 0;
}
// 根据题目要求,设置最大位数限制
if ((d == 9 || d == 8) && n > 18)
{
m = 18;
}
else if (d < 9 && n > 19)
{
m = 19;
}
else
{
m = n;
}
// 计算结果
for (i = m; i >= 1; i--)
{
tmp = i * d + a[m - i];
a[m - i] = tmp % 10;
a[m - i + 1] = tmp / 10;
}
// 输出结果
printf("Case %d: s(%d, %d) = ", j, d, m);
int flag = 0;
for (i = m; i >= 0; i--)
{
if (a[i] != 0)
{
flag = 1;
}
if (flag)
{
printf("%d", a[i]);
}
}
printf("\n");
j++;
}
}
return 0;
}
09 判断同构数
问题描述 给定一个十进制正整数,判断其是否为同构数。所谓同构数是这样的一些数,它出现在其平方数的右边,例如5是出现在$5^2=25$右边的数,25是出现在$25^2=625$右边的数,所以5和25都是同构数。
输入 输入数据有若干行。每行上有一个正整数,对应一种情形。
输出 对于每一种情形,先输出“Case #: ”(#为序号,从1起),然后输出n,逗号及空格,n的平方,逗号及空格,结果(Yes或No),换行。
输入样例
5
15
25
输出样例
Case 1: 5, 25, Yes
Case 2: 15, 225, No
Case 3: 25, 625, Yes
#include <stdio.h>
#include <math.h>
int main()
{
int n1, n2;
int m = 1;
while(scanf("%d",&n1) == 1)
{
n1 = abs(n1);
n2 = n1 * n1;
int num = n2;
int counts = 0;
do
{
num = num/10;
counts++;
}while(num != 0);
int flag = 0;
for(int i = 1;i <= counts;i++)
{
if(n1 == (n2 % (int)(pow(10,counts-i))))
{
flag = 1;
break;
}
else if(n1 != (n2 % (int)(pow(10,counts-i))))
flag = 0;
}
if(flag == 1 || n1 == 1)
printf("Case %d: %d, %d, Yes\n",m++,n1,n2);
else
printf("Case %d: %d, %d, No\n",m++,n1,n2);
}
return 0;
}
10 计算两个向量的点积
问题描述 给定两个向量,计算它们的点积(内积)。
输入 输入数据有若干行。每行上有两个向量(维数皆不超过20),对应一种情形。
输出 对于每一种情形,先输出"Case #: "(#为序号,从1起),然后输出结果(保留2位小数),当维数不同时,输出none。
输入样例
(1, 2, 3, 4, 5) (5, 4, 3, 2, 1)
(1, 2) (-2, 1)
(1, 2, 3) (1, 2)
输出样例
Case 1: 35.00
Case 2: 0.00
Case 3: none
#include <stdio.h>
int variables_input(int *vector, char ch)
{
int i = 0;
int n = 0;
while(ch != ')')
{
if (ch == '(' || ch == ' ')
{
scanf("%d", vector + i);
i++;
}
else if (ch == ',')
n++;
else if (ch == '-')
{
scanf("%d",vector + i);
*(vector + i) = -*(vector + i);
i++;
}
scanf("%c", &ch);
if (ch == '\n')
break;
}
*(vector + i) = '\0';
return n + 1;
}
int main()
{
int i;
int x = 1;
char ch;
int vector1_dim, vector2_dim;
int vector1[20], vector2[20];
double answer;
while(scanf("%c", &ch) == 1)
{
answer = 0.00;
vector1_dim = variables_input(vector1, ch);
if (vector1_dim == 0)
break;
scanf("%c", &ch);
scanf("%c", &ch);
vector2_dim = variables_input(vector2, ch);
if (vector1_dim == vector2_dim)
{
for (i = 0; i < vector1_dim; i++)
answer += vector1[i] * vector2[i];
printf("Case %d, %.2lf\n", x++, answer);
}
else printf("Case %d, none\n", x++);
}
return 0;
}