算法竞赛入门经典各章习题答案.docx
《算法竞赛入门经典各章习题答案.docx》由会员分享,可在线阅读,更多相关《算法竞赛入门经典各章习题答案.docx(21页珍藏版)》请在冰豆网上搜索。
算法竞赛入门经典各章习题答案
第一章
习题1-1
#include
intmain()
{
inta,b,c;
doubled;
scanf("%d%d%d",&a,&b,&c);
d=(double)(a+b+c);
printf("%.3lf\n",d/3.0);
return0;
}
习题1-2
#include
intmain()
{
intf;
doublec;
scanf("%d",&f);
c=5*(f-32)/9;
printf("%.3lf\n",c);
return0;
}
习题1-3
#include
intmain()
{
intn;
scanf("%d",&n);
printf("%d\n",(n*(1+n))/2);
return0;
}
习题1-4
#include
#include
#definepi4.0*atan(1.0)
intmain()
{
intn;
scanf("%d",&n);
printf("%lf\n",sin((pi*n)/180));
printf("%lf\n",cos((pi*n)/180));
return0;
}
习题1-5
#include
intmain()
{
doublex1,y1,x2,y2,a;
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
a=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
printf("%lf\n",a);
return0;
}
习题1-6
#include
intmain()
{
intn;
scanf("%d",&n);
if(n%2==0)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
return0;
}
习题1-7
#include
intmain()
{
intn;
doublea;
scanf("%d",&n);
a=n*95.0;
if(a<300)
{
printf("%.2lf\n",a);
}
else
{
printf("%.2lf\n",a*0.85);
}
return0;
}
习题1-8
#include
#include
intmain()
{
doublen;
scanf("%lf",&n);
printf("%.2lf",fabs(n));
return0;
}
习题1-9
#include
intmain()
{
inta,b,c;
scanf("%d%d%d",&a,&b,&c);
if(a==b&&b==c)
{
printf("no\n");
}
if((a*a+b*b==c*c)||(a*a+c*c==b*b)||(b*b+c*c==a*a))
{
printf("yes\n");
}
else
{
printf("no\n");
}
return0;
}
习题1-10
#include
intmain()
{
intn;
scanf("%d",&n);
if(n%4==0)
{
if(n%100!
=0)
{
printf("no\n");
}
else
{
if(n%400==0)
{
printf("yes\n");
}
else
{
printf("no\n");
}
}
}
else
{
printf("no\n");
}
return0;
}
第二章
习题2-1
#include
intmain()
{
intn,count=0;
scanf("%d",&n);
while(n>0)
{
count++;
n=n/10;
}
printf("%d\n",count);
return0;
}
习题2-2
#include
intmain()
{
inta,b,c;
for(inti=100;i<=999;i++)
{
a=i%10;
b=i/10%10;
c=i/100;
if(i==a*a*a+b*b*b+c*c*c)
{
printf("%d\n",i);
}
}
return0;
}
习题2-3
#include
intmain()
{
inti,a,b,c;
scanf("%d%d%d",&a,&b,&c);
for(i=10;i<=100;i++)
{
if(i%3==a&&i%5==b&&i%7==c)
{
printf("%d\n",i);
}
}
if(i==101)
{
printf("noanswer\n");
}
return0;
}
习题2-4
#include
intmain()
{
inti,j,k,n;
scanf("%d",&n);
for(i=n;i>0;i--)
{
for(k=0;k{
printf("");
}
for(j=0;j<2*i-1;j++)
{
printf("#");
}
printf("\n");
}
return0;
}
习题2-5
文件题,南邮竞赛基本不涉及。
。
。
习题2-6
#include
intmain()
{
inti,n;
doublesum=1.0;
scanf("%d",&n);
for(i=2;i<=n;i++)
{
sum+=(1.0/i);
}
printf("%.3lf\n",sum);
return0;
}
习题2-7
#include
#include
intmain()
{
intt=-1;
doublea=1.0,sum=1.0;
while(fabs(a)>=0.000001)
{
a=1.0/(a+2);
a=a*t;
sum=sum+a;
t=t*(-1);
}
printf("%.9lf\n",sum);
return0;
}
习题2-8
#include
intmain()
{
inti,n,m,temp;
doublesum=0;
scanf("%d%d",&n,&m);
if(n>m)
{
temp=n;
n=m;
m=temp;
}
for(i=n;i<=m;i++)
{
sum=sum+(1.0/i/i);
}
printf("%.5lf\n",sum);
return0;
}
习题2-9
printf的特殊用法:
对于m.n的格式可以用如下方法表示
charch[20];
printf("%*.*s\n",m,n,ch);
前边的*定义的是总的宽度,后边的定义的是输出的个数。
分别对应外面的参数m和n。
这种方法的好处是可以在语句之外对参数m和n赋值,从而控制输出格式。
#include
intmain()
{
inta,b,c;
scanf("%d%d%d",&a,&b,&c);
printf("%.*lf\n",c,(double)a/b);
return0;
}
习题2-10
#include
intmain()
{
inta,b,c,d,e,f,g,h,i;
for(a=1;a<=9;a++)
{
for(b=1;b<=9;b++)
{
for(c=1;c<=9;c++)
{
for(d=1;d<=9;d++)
{
for(e=1;e<=9;e++)
{
for(f=1;f<=9;f++)
{
for(g=1;g<=9;g++)
{
for(h=1;h<=9;h++)
{
for(i=1;i<=9;i++)
{
if((2*(a*100+b*10+c)==1*(d*100+e*10+f))&&(3*(a*100+b*10+c)==1*(g*100+h*10+i))&&(a!
=b)&&(a!
=c)&&(a!
=d)&&(a!
=e)&&(a!
=f)&&(a!
=g)&&(a!
=h)&&(a!
=i)&&(b!
=c)&&(b!
=d)&&(b!
=e)&&(b!
=f)&&(b!
=g)&&(b!
=h)&&(b!
=i)&&(c!
=d)&&(c!
=e)&&(c!
=f)&&(c!
=g)&&(c!
=h)&&(c!
=i)&&(d!
=e)&&(d!
=f)&&(d!
=g)&&(d!
=h)&&(d!
=i)&&(e!
=f)&&(e!
=g)&&(e!
=h)&&(e!
=i)&&(f!
=g)&&(f!
=h)&&(f!
=i)&&(g!
=h)&&(g!
=i)&&(h!
=i))
{
printf("%d,%d,%d\n",a*100+b*10+c,d*100+e*10+f,g*100+h*10+i);
}
}
}
}
}
}
}
}
}
}
return0;
}
第三章
习题3-1
#include
#include
intmain()
{
inti,a[101],n,max;
memset(a,sizeof(a),0);
while(scanf("%d",&n)==1)
{
a[n]++;
}
max=a[0];
for(i=1;i<101;i++)
{
if(a[i]>=max)
{
max=a[i];
}
}
for(i=0;i<101;i++)
{
if(a[i]==max)
{
printf("%d",i);
}
}
printf("\n");
return0;
}
习题3-2
#include
#include
chars[1000];
intmain()
{
charch;
inti,j,m=0,sumlong=0,count=0;
while
(1)
{
scanf("%c",&ch);
if(ch=='\n'||ch==EOF)
{
break;
}
else
{
s[m++]=ch;
}
}
for(i=m-1;i>0;i--)
{
if(s[i]==''&&s[i-1]=='')
{
for(j=i-1;j{
s[j]=s[j+1];
}
m--;
}
}
for(i=0;i{
if(isalpha(s[i]))
{
sumlong++;
}
elseif(s[i]=='')
{
count++;
}
}
printf("%.2lf\n",(double)((sumlong+count+1)/(count+1)));
return0;
}
习题3-3(重新做!
!
!
)
#include
#include
#definemod1000
chars[10000];
charbuf[10000];
intmain()
{
inti,m=0,n=0,sum=1;
charch;
while
(1)
{
scanf("%c",&ch);
if(ch==EOF||ch=='\n')
{
break;
}
else
{
s[m++]=ch;
}
}
for(i=0;i{
if(isdigit(s[i]))
{
buf[n++]=s[i]-'0';
}
}
for(i=0;i{
sum=sum*buf[i];
}
printf("%d\n",sum%mod);
return0;
}
习题3-4
习题3-5
#include
chara[1000][1000];
intmain()
{
inti,j,n;
scanf("%d",&n);
scanf("");
chartemp;
for(i=0;i{
for(j=0;j{
scanf("%c",&a[i][j]);
}
}
for(i=0;i{
for(j=i;j{
temp=a[i][j];
a[i][j]=a[j][i];
a[j][i]=temp;
}
}
for(i=n-1;i>=0;i--)
{
for(j=0;j{
printf("%c",a[i][j]);
}
printf("\n");
}
return0;
}
习题3-6
#include
intmain()
{
intb,n,m=0;
charp[100];
scanf("%d%d",&b,&n);
while(b!
=0)
{
p[m++]=b%n+'0';
b=b/n;
}
for(inti=m-1;i>=0;i--)
{
printf("%c",p[i]);
}
printf("\n");
return0;
}
习题3-7
#include
intndjc(intn,intm)
{
inti,a=1;
for(i=0;i{
a*=m;
}
returna;
}
intmain()
{
inti,b,n,p[100],m=0,a=0;
scanf("%d%d",&n,&b);
while(n>0)
{
p[m++]=n%10;
n=n/10;
}
m--;
for(i=m;i>=0;i--)
{
a+=p[i]*ndjc(i,b);
}
printf("%d\n",a);
return0;
}
习题3-8