杭电ACM.docx
《杭电ACM.docx》由会员分享,可在线阅读,更多相关《杭电ACM.docx(29页珍藏版)》请在冰豆网上搜索。
杭电ACM
1.
ProblemDescription
输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符。
Input
输入数据有多组,每组占一行,有三个字符组成,之间无空格。
Output
对于每组输入数据,输出一行,字符中间用一个空格分开。
SampleInputqweasdzxc
SampleOutputeqwadscxz
方案:
#includeintmain()
{
charstr[4],t;
while(scanf("%s",&str)!
=EOF){
for(inti=0;i<2;i++)
{
if(str[i]>str[i+1])
{
t=str[i];
str[i]=str[i+1];
str[i+1]=t;
}
if(str[0]>str[2])
{
t=str[0];
str[0]=str[2];
str[2]=t;
}printf("%c%c%c\n",str[0],str[1],str[2]);
}
}
2.
ProblemDescription
输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离。
Input
x1,y1,x2,y2,数据之间用空格隔
输入数据有多组,每组占一行,由4个实数组成,分别表示开。
Output对于每组输入数据,输出一行,结果保留两位小数。
SampleInput
0001
0110
SampleOutput
1.00
1.41
答案:
#include
#include
voidmain()
{
doublea,b,c,d;
doublee;
while(scanf("%lf%lf%lf%lf",&a,&b,&c,&d)!
=EOF)
{
e=sqrt((d-b)*(d-b)+(c-a)*(c-a));printf("%.2lf\n",e);
}
}
3.
ProblemDescription根据输入的半径值,计算球的体积。
Input
输入数据有多组,每组占一行,每行包括一个实数,表示球的半径。
Output
输出对应的球的体积,对于每组输入数据,输出一行,计算结果保留三位小数。
SampleInput
1
1.5
SampleOutput
4.189
14.137
Hint
#definePI3.1415927
答案:
#include
#definePI3.1415927voidmain()
{
doublei;
doublej;while(scanf("%lf",&i)!
=EOF){
j=(4.0/3.0)*PI*i*i*i;
printf("%.3lf\n",j);
}
4.
ProblemDescription求实数的绝对值。
Input
输入数据有多组,每组占一行,每行包含一个实数。
Output
对于每组输入数据,输出它的绝对值,要求每组数据输出一行,结果保留两位小数。
SampleInput
123
-234.00
SampleOutput
123.00
234.00
答案:
#include
#include
voidmain()
{
doublei,j;
while(scanf("%lf",&i)!
=EOF)
{
j=sqrt(i*i);
printf("%.2lf\n",j);
}
}
5.
ProblemDescription
输入一个百分制的成绩t,将其转换成对应的等级,具体转换规则如下:
90~100为A;
80~89为B;
70~79为C;
60~69为D;
0~59为E;
Input输入数据有多组,每组占一行,由一个整数组成。
Output
Scoreis
对于每组输入数据,输出一行。
如果输入数据不在0~100范围内,请输出一行:
error!
”。
SampleInput
56
67
100
123
SampleOutput
E
D
A
Scoreiserror!
答案:
#includevoidmain(){
inti;
while(scanf("%d",&i)!
=EOF)
{
chargrade;
if(i>0&&i<60)grade='E';
elseif(i>=60&&i<70)
grade='D';
elseif(i>=70&&i<80)grade='C';
elseif(i>=80&&i<90)
grade='B';
elseif(i>=90&&i<=100)
grade='A';
else
grade='F';
switch(grade)
{
case'E':
printf("E\n");break;
case'D':
printf("D\n");break;
case'C':
printf("C\n");break;
case'B':
printf("B\n");break;
case'A':
printf("A\n");break;default:
printf("Scoreiserror!
\n");}
}
}
6.
ProblemDescription
给定一个日期,输出这个日期是该年的第几天。
Input
输入数据有多组,每组占一行,数据格式为YYYY/MM/DD组成,具体参见sampleinput另外,可以向你确保所有的输入数据是合法的。
Output对于每组输入数据,输出一行,表示该日期是该年的第几天。
SampleInput
1985/1/20
2006/3/12
SampleOutput
20
71
答案:
#include
voidmain()
{
inta,b,c;
while(scanf("%d/%d/%d",&a,&b,&c)!
=EOF)
{
intdata1,data2,data3,data;
if((a%4!
=0)||(a%400!
=0)&&(a%100==0)){
if(b>2&&b<=12)
{
if(b<5)
{data1=31*(b/2);data2=0;data3=28;data=data1+data2+data3+c;printf("%d\n",data);
}elseif(b<7){data1=31*(b/2);data2=30;data3=28;data=data1+data2+data3+c;printf("%d\n",data);
}
elseif(b<10)
{data1=31*(b/2);data2=30*2;data3=28;data=data1+data2+data3+c;printf("%d\n",data);
}
elseif(b<12)
{data1=31*(b/2);data2=30*3;data3=28;data=data1+data2+data3+c;printf("%d\n",data);
}
else
{
data1=31*(b/2);
data2=30*4;
data3=28;
data=data1+data2+data3+c;
printf("%d\n",data);
}
}
elseif(b>0&&b<=2)
{
if(b==1)
{
data=c;
printf("%d\n",data);
}
else
{
data=31+c;
printf("%d\n",data);
}
}
}
elseif((a%400==0)||(a%4==0)&&(a%100!
=0))
{
if(b>2&&b<=12)
{
if(b<5)
{
data1=31*(b/2);
data2=0;
data3=29;
data=data1+data2+data3+c;
printf("%d\n",data);
}
elseif(b<7)
{
data1=31*(b/2);
data2=30;
data3=29;
data=data1+data2+data3+c;
printf("%d\n",data);
elseif(b<10)
{data1=31*(b/2);data2=30*2;data3=29;data=data1+data2+data3+c;printf("%d\n",data);
}
elseif(b<12)
{data1=31*(b/2);data2=30*3;data3=29;data=data1+data2+data3+c;printf("%d\n",data);
}
else
{data1=31*(b/2);data2=30*4;data3=29;
data=data1+data2+data3+c;printf("%d\n",data);
}
}
elseif(b>0&&b<=2)
{
if(b==1)
{
data=c;
printf("%d\n",data);
}
else
{
data=31+c;
printf("%d\n",data);
}
}
7.
ProblemDescription
给你n个整数,求他们中所有奇数的乘积。
n,表示本组数据
Input输入数据包含多个测试实例,每个测试实例占一行,每行的第一个数为共有n个,接着是n个整数,你可以假设每组数据必定至少存在一个奇数。
Output输出每组数中的所有奇数的乘积,对于测试实例,输出一行。
SampleInput
3123
42345
SampleOutput
3
15
答案:
#include
intmain()
{
intn,t,result;
while(scanf("%d",&n)!
=EOF)
{
inti;result=1;
for(i=0;i}
printf("%d\n",result);
}
return0;
}
8.
ProblemDescription
给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和。
Input
输入数据包含多组测试实例,每组测试实例包含一行,由两个整数m和n组成。
Output
对于每组输入数据,输出一行,应包括两个整数x和y,分别表示该段连续的整数中所有偶
数的平方和以及所有奇数的立方和。
你可以认为32位整数足以保存结果。
SampleInput
13
25
SampleOutput
428
20152
答案:
#includevoidmain()
{
longa,b,m,n;
while(scanf("%d%d",&a,&b)!
=EOF){
m=0;
n=0;
if(a>b)
{
longt;t=a;
a=b;b=t;
}
for(a;a<=b;a++)
{if(a%2==0){
m+=a*a;}else{
n+=a*a*a;}
}
printf("%d%d\n",m,n);
}
}
9.
ProblemDescription
统计给定的n个数中,负数、零和正数的个数。
Input
输入数据有多组,每组占一行,每行的第一个数是整数n(n<100),表示需要统计的数值的
个数,然后是n个实数;如果n=0,则表示输入结束,该行不做处理。
Output
对于每组输入数据,输出一行a,b和c,分别表示给定的数据中负数、零和正数的个数。
SampleInput
60123-10
512340.5
SampleOutput
123
005
答案“:
#include
intmain()
{
intn,a,b,c,i;
doublem;
while(scanf("%d",&n)!
=EOF)
{
a=b=c=0;
if(n!
=0)
{
for(i=0;i{
scanf("%lf",&m);if(m<0)a++;
elseif(m==0)b++;
elseif(m>0)c++;
}
}
else
break;
printf("%d%d%d\n",a,b,c);
}
}
10.
ProblemDescription数列的定义如下:
m项的和。
数列的第一项为n以后各项为前一项的平方根,求数列的前
Input
输入数据有多组,每组占一行,由两个整数n(n<10000)和m(m<1000)组成,n和m的含
义如前所述。
Output
2位小数。
对于每组输入数据,输出该数列的和,每个测试实例占一行,要求精度保留
SampleInput
814
22
SampleOutput
94.73
3.41
答案:
#include
#includeintmain()
{
doublen;
intm;
while(scanf("%lf",&n)!
=EOF){
inti;
doublea=n,j=0;
scanf("%d",&m);
for(i=1;i{
j=sqrt(n);a+=j;n=j;
}
printf("%.2lf\n",a);
}return0;
11.
ProblemDescription
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:
153=1人3+5人3+3人3。
现在要求输出所有在m和n范围内的水仙花数。
Input输入数据有多组,每组占一行,包括两个整数m和n(100<=m<=n<=999)。
Output
对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;
如果给定的范围内不存在水仙花数,则输出no;每个测试实例的输出占一行。
SampleInput
100120
300380
SampleOutput
no
370371
答案:
#include
intmain()
{
intm,n,a,b,c,d;
while(scanf("%d%d",&m,&n)!
=EOF){
d=0;//每次输入要初始化个数。
while(m<=n)
{a=m%10;b=(m%100)/10;c=m/100;
if(a*a*a+b*b*b+c*c*c==m){
if(d==0)printf("%d",m);
else
printf("%d",m);d++;
}
m++;
}
if(d==0)printf("no\n");
elseprintf("\n");
}
return0;
}
12.
ProblemDescription多项式的描述如下:
1-1/2+1/3-1/4+1/5-1/6+...现在请你求出该多项式的前n项的和。
Input
m(m<100),表示测试实例的个数,第二行包含
输入数据由2行组成,首先是一个正整数
m个正整数,对于每一个整数(不妨设为n,n<1000),求该多项式的前n项的和。
Output
对于每个测试实例n,要求输出多项式前n项的和。
每个测试实例的输出占一行,结果保留
2位小数。
SampleInput
2
12
SampleOutput
1.00
0.50
答案:
#include
intmain()
{
intn,m,i;
doublea[1000],j;
a[1]=1;
for(i=2;i<1000;i++)
{
j=1.0/i;
if(i%2!
=1)a[i]=a[i-1]-j;
elsea[i]=a[i-1]+j;
}
while(scanf("%d",&n)!
=EOF)
{
while(n--)
{
scanf("%d",&m);printf("%.2f\n",a[m]);
}
}
return0;
}
13.
ProblemDescription
对于表达式nA2+n+41,当门在(x,y)范围内取整数值时(包括x,y)(-39<=xInput输入数据有多组,每组占一行,由两个整数x,y组成,当x=0,y=0时,表示输入结束,该
行不做处理。
Output
"OK",否则请输出“Sorry”,
对于每个给定范围内的取值,如果表达式的值都为素数,则输出每组输出占一行。
SampleInput
01
00
SampleOutput
OK
答案:
#include
intmain(void)
{
intx,y,i,j,k,sum,t;
while(scanf("%d%d",&x,&y)!
=EOF)
{
sum=0;
if(x==0&&y==0)
break;
else
{
for(i=x;i<=y;i++)
{
t=i*i+i+41;
k=1;
for(j=2;j*j<=t;j++){
if(t%j==0)
{
k=0;
break;
}
}
if(k)
sum++;
}
if(sum==y-x+1)
printf("OK\n");
else
printf("Sorry\n");
}
}
return0;
14.
ProblemDescription
喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:
悟空是在研究一个数学问题!
什么问题?
他研究的问题是蟠桃一共有多少个!
不过,到最后,他还是没能解决这个难题,呵呵A-A
当时的情况是这样的:
第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。
聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?
Input
输入数据有多组,每组占一行,包含一个正整数n(1是在第n天发生的。
Output对于每组输入数据,输出第一天开始吃的时候桃子的总数,每个测试实例占一行。
SampleInput
2
4
SampleOutput
422
答案:
#include
#includeintmain(void)
{
intn;
while(scanf("%d",&n)!
=EOF)printf("%.0f\n",3*pow(2,n-1)-2);
return0;
15.
ProblemDescription
青年歌手大奖赛中,评委会给参赛选手打分。
选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分。
Input
输入数据有多组,每组占一行,每行的第一个数是n(2n个评委的打分。
Output
2位小数,每组输出占一行。
对于每组输入数据,输出选手的得分,结果保留
SampleInput
3999897
4100999897
SampleOutput
98.00
98.50
答案:
#include
intmain()
{
intn,i,a,b;
intstr[100];
floatsum;
while(scanf("%d",&n)!
=EOF)
{
sum=0;for(i=0;iscanf("%d",&str[i]);sum+=str[i];
}
for(a=0;aif(str[b]>str[b+1])
{intt;t=str[b];str[b]=str[b+1];str[b+1]=t;
}
}
printf("%.2f\n",(sum-str[0]-str[n-1])*1.0/(n-2));}return0;
}
16.
ProblemDescription
有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。
编程输出该平均值序列。
Input
n和m,n和m的含义如上所述。
输入数据有多组,每组占一行,包含两个正整数
Output
对于每组输入数据,输出一个平均值序列,每组输出占一行。
SampleInput
32
42
SampleOutput
36
37
答案:
#include
intmain(void)
{
inti,n,m,b;
while(scanf("%d%d",&n,&m)!
=EOF)
{
b=2;
for(i=0;i{
printf("%d",b+m-1);
b+=m*2;
}
printf(n%m?
"%d\n":
"\n",b+n%m-1);
}
return0;
}
17.
ProblemDescription
输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数。
Input
输入数据有多组,每组占一行,每行的开始是一个整数n,表示这个测试实例的数值的个数,跟着就是n个整数。
n=0表示输入的结束,不做处理。
Output
对于每组输入数据,输出交换后的数列,每组输出占一行。
SampleInput
42134
554321
0
SampleOutput
1234
14325
答案:
#include
intmain()
{
inti,n,index,t