杭电ACM.docx
《杭电ACM.docx》由会员分享,可在线阅读,更多相关《杭电ACM.docx(32页珍藏版)》请在冰豆网上搜索。
杭电ACM
1.
ProblemDescription
输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符。
Input
输入数据有多组,每组占一行,有三个字符组成,之间无空格。
Output
对于每组输入数据,输出一行,字符中间用一个空格分开。
SampleInput
qwe
asd
zxc
SampleOutput
eqw
ads
cxz
方案:
#include
intmain()
{
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
输入数据有多组,每组占一行,由4个实数组成,分别表示x1,y1,x2,y2,数据之间用空格隔开。
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.1415927
voidmain()
{
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
对于每组输入数据,输出一行。
如果输入数据不在0~100范围内,请输出一行:
“Scoreiserror!
”。
SampleInput
56
67
100
123
SampleOutput
E
D
A
Scoreiserror!
答案:
#include
voidmain()
{
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个整数,求他们中所有奇数的乘积。
Input
输入数据包含多个测试实例,每个测试实例占一行,每行的第一个数为n,表示本组数据一共有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{
scanf("%d",&t);
if((t&1)==1)
result*=t;
}
printf("%d\n",result);
}
return0;
}
8.
ProblemDescription
给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和。
Input
输入数据包含多组测试实例,每组测试实例包含一行,由两个整数m和n组成。
Output
对于每组输入数据,输出一行,应包括两个整数x和y,分别表示该段连续的整数中所有偶数的平方和以及所有奇数的立方和。
你可以认为32位整数足以保存结果。
SampleInput
13
25
SampleOutput
428
20152
答案:
#include
voidmain()
{
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
0
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
数列的定义如下:
数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和。
Input
输入数据有多组,每组占一行,由两个整数n(n<10000)和m(m<1000)组成,n和m的含义如前所述。
Output
对于每组输入数据,输出该数列的和,每个测试实例占一行,要求精度保留2位小数。
SampleInput
814
22
SampleOutput
94.73
3.41
答案:
#include
#include
intmain()
{
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");
else
printf("\n");
}
return0;
}
12.
ProblemDescription
多项式的描述如下:
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位小数。
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;
else
a[i]=a[i-1]+j;
}
while(scanf("%d",&n)!
=EOF)
{
while(n--)
{
scanf("%d",&m);
printf("%.2f\n",a[m]);
}
}
return0;
}
13.
ProblemDescription
对于表达式n^2+n+41,当n在(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
喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:
悟空是在研究一个数学问题!
什么问题?
他研究的问题是蟠桃一共有多少个!
不过,到最后,他还是没能解决这个难题,呵呵^-^
当时的情况是这样的:
第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。
聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?
Input
输入数据有多组,每组占一行,包含一个正整数n(1Output
对于每组输入数据,输出第一天开始吃的时候桃子的总数,每个测试实例占一行。
SampleInput
2
4
SampleOutput
4
22
答案:
#include
#include
intmain(void)
{
intn;
while(scanf("%d",&n)!
=EOF)
printf("%.0f\n",3*pow(2,n-1)-2);
return0;
}
15.
ProblemDescription
青年歌手大奖赛中,评委会给参赛选手打分。
选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分。
Input
输入数据有多组,每组占一行,每行的