您的位置:首页 > 其它

算法竞赛入门经典 第3章 习题答案

2013-08-06 16:31 197 查看
习题3-1 分数统计

输入一些学生的分数,哪个分数出现的次数最多?如果有多个并列,从小到大输出。

任务1:分数均为不超过100的非负整数

任务2:分数均为不超过100的非负实数,但最多保留两位小数

#include<stdio.h>
#include<string.h>
#define MAXN 5000
int s[MAXN],m[MAXN][2];
int main()
{
double x;
freopen("xt3-1.in","r",stdin)    ;
int i=0,j=0,temp=0,length,min,max=0,last;
while(scanf("%lf",&x) == 1)
{
temp=x*1000;
temp=temp%10;
if (temp>=5) s[i++]=x*100+1;
else
s[i++]=x*100;
printf("%d-%.2lf-%d  ",i-1,x,s[i-1]);
}
printf("\n");
length = i-1;
for(i=0;i<=length;i++)
{
min=s[i];
for (j=0;j<=i-1;j++)
{
if (min<=s[j])
{
min=s[j];
s[j]=s[i];
s[i]=min;
for (j=j+1;j<=i;j++)
{
min=s[j];
s[j]=s[i];
s[i]=min;
//printf("%d %d %d\n",min,i ,j);
}

}
}

}
j=0;
for(i=0;i<=length;i++)
{
last=i-1;
if ((i>0)&&(s[last]==s[i]))
{
m[j][1]++;
if (max<m[j][1]) max=m[j][1];
//printf("+ s[%d]=%d max=%d m[%d][1]=%d m[%d][0]=%d \n",i,s[i],max,j,m[j][1],j,m[j][0]);
}
else
{
if (i!=0) j++;
m[j][0]=s[i];
m[j][1]=1;
//  printf("n s[%d]=%d max=%d m[%d][1]=%d m[%d][0]=%d \n",i,s[i],max,j,m[j][1],j,m[j][0]);
}
}
//for (i=0;i<=max;i++) printf("m[%d][0]=%d m[%d][1]=%d\n",i,m[i][0],i,m[i][1]);
for(i=0;i<=length;i++)
{
//if (m[i][1]==max) printf("m[%d][0]=%d m[%d][1]=%d max=%d\n",i,m[i][0],i,m[i][1],max) ;
if (m[i][1]==max) printf("%.2lf\n",m[i][0]/100.0) ;
}

return 0;
}


习题3-2 单词的长度

输入若干个单词,输出它们的平均长度。单词只包含大写字母和小写字母,用一个或多个空格隔开

#include<stdio.h>
#include<string.h>
#define MAXN 5000
char a[MAXN];
int main()
{
freopen("xt3-2.in","r",stdin);
int i,j,k,n=0,len=0,sumlen=0,count=0,kongge=1,temp;
double l;
fgets(a,sizeof(a),stdin);
for(i=0;i<=strlen(a)-1;i++)
{
//printf("%d\n",a[i]);
if (((a[i]=='\n')||(a[i]==' ')||(a[i]==EOF))&&(kongge==0))
{
sumlen+=len;
//printf("%d %d\n",len,sumlen);
len=0;
kongge=1;
}
if ((a[i]!='\n')&&(a[i]!=32)&&(a[i]!=EOF))
{
len++;
if (kongge==1)
{
count++;
kongge=0;
}
//printf("长度=%d\n",len);
}

}
sumlen+=len;
//printf("%d %d\n",sumlen,count);
temp=(sumlen*100)/count%10;
if (temp>=5) temp=(sumlen*100)/count+1;
else temp=(sumlen*100)/count;
//printf("%d\n",temp);
printf("%.2lf",temp/100.0);
return 0;
}


习题3-3 乘积的末3位

输入若干个整数(可以是正数、负数或者零),输出它们的乘积的末三位。这些整数中会混入一些由大写字母组成的字符串,你的程序应当忽略它们。提示:试试看,在执行scanf(“%d”)时输入一个字符串会怎样?

#include<stdio.h>
#include<string.h>
#include<math.h>
#define MAXN 5000
char a[MAXN];
int b[MAXN];
int main()
{
freopen("xt3-3.in","r",stdin);
int i,j=0,k,chuli=0,fuhao=1,changdu,kongge=0;
long plus=1;
fgets(a,sizeof(a),stdin);
for (i=0;i<=strlen(a);i++)
{
//printf("%d %d %c\n",i,a[i],a[i]);
chuli=0;
if (((a[i]==45)||(a[i]==32)||(a[i]==0))||((a[i]>=48)&&(a[i]<=57))) chuli=1;
if (chuli==1)
{
if (a[i]==45) fuhao=-1;
else
{

if((a[i]==32)||(a[i]==0))
{
if (kongge==0)
{
kongge=1;
b[j]=b[j]*fuhao;
fuhao=1;
j++;
}
}
else
{
kongge=0;
b[j]=(a[i]-48)+b[j]*10;
// printf("b[%d]=%d\n",j,b[j]);
}
}
}
//if(a[i]==0) printf("EOF");
}
for (i=0;i<=j-1;i++)
{
plus*=b[i];
//printf("b[%d]=%d plus=%d\n",i,b[i],plus);
}
printf("%03d",abs(plus%1000));
return 0;
}


习题3-4 计算器

编写程序,读入一行恰好包含一个加号、减号或乘号的表达式,输出它的值。这个运算符保证是二元运算符,且两个数均为不超过100的非负整数。运算数和运算符可以紧挨着,也可以用一个或多个空格、TAB隔开。行首末尾均可以有空格。提示:选择合适的输入方法可以将问题简化。

样例输入:1+1

样例输出:2

样例输入:2- 5

样例输出:-3

样例输入:0 *1982

样例输出:0

#include<stdio.h>
#define MAXN 5000
int main()
{
int a,b,c;
char f;
scanf("%d",&a);
//printf("1 %d\n",a);
scanf("%c",&f);
while((f!='+')&&(f!='-')&&(f!='*')) scanf("%c",&f);
//printf("2 %c\n",f);
scanf("%d",&b);
//printf("3 %d\n",b);
if (f=='+') c=a+b;
else
if(f=='-') c=a-b;
else
c=a*b;
printf("%d",c);
return 0;
}


习题3-5 选择

输入一个n*n的字符矩阵,把它左转90度后输出。

#include<stdio.h>
#define MAXN 5000
char a[MAXN][MAXN];
int main()
{
freopen("xt3-5.in","r",stdin);
int i=0,j=0,k,n;
while(scanf("%c",&a[i][j])==1)
{
if (a[i][j]!='\n') j++;
else {i++;j=0;}
//printf("i=%d j=%d\n",i,j);
}
n=i;
for (i=0;i<=n;i++)
{
for (j=n;j>=0;j--)
printf("%c",a[j][i]);
if (i!=n)printf("\n");
}

}


习题3-6 进制转换1

输入基数b(2<=b<=10)和正整数n(十进制),输出n的b进制表示。

#include<stdio.h>
int main()
{
int a[10],b,i=0,j=0,n;
scanf("%d %d", &b, &n);
while(n>0)
{
a[i]=n%b;
n=n/b;
//printf("%d %d \n",n,a[i]);
i++;
}
for(j=i-1;j>=0;j--)
printf("%d",a[j]);
return 0;
}


习题3-7 进制转换2

输入基数b(2<=b<=10)和正整数n(b进制),输出n的十进制表示。

#include<stdio.h>
int main()
{
int i=0,j=0,b,n,temp,wei=1,ji=1,sum=0;
scanf("%d %d",&b,&n);
temp = n;
while (temp>0)
{
temp=temp/10;
if (temp>0) wei*=10;
}
printf("wei=%d\n",wei);
temp=n;
while(wei>=1)
{
i=wei;
while (i>1)
{
ji*=b;
i=i/10;
printf("i=%d %d\n",i,ji);
}
sum+=(temp/wei)*ji;
printf("sum=%d\n",sum);
temp=temp%wei;
wei/=10;
ji=1;
}
printf("%d",sum);
return 0;
}


习题3-8 手机键盘

输入一个由小写字母组成的英文单词,输出用手机的默认英文输入法的敲键序列。例如要打出pig这个单词,需要按1次p,3次i,(稍作停顿后)1次i,记为p1i3i1。

#include<stdio.h>
#define MAXN 5000
int a[MAXN];
int main()
{
int i=0,j=0,temp=0;
while(scanf("%c",&a[i])==1)
{
for(j=1;j<=8;j++)
{
if ((j==1)&&((temp=a[i]-96)<=3)&&(a[i]!='\n')) {printf("%c%d",a[i],temp);break;}
if ((j==2)&&((temp=a[i]-99)<=3)&&(a[i]!='\n')){printf("%c%d",a[i],temp);break;}
if ((j==3)&&((temp=a[i]-102)<=3)&&(a[i]!='\n')){printf("%c%d",a[i],temp);break;}
if ((j==4)&&((temp=a[i]-105)<=3)&&(a[i]!='\n')){printf("%c%d",a[i],temp);break;}
if ((j==5)&&((temp=a[i]-108)<=3)&&(a[i]!='\n')){printf("%c%d",a[i],temp);break;}
if ((j==6)&&((temp=a[i]-111)<=4)&&(a[i]!='\n')){printf("%c%d",a[i],temp);break;}
if ((j==7)&&((temp=a[i]-115)<=3)&&(a[i]!='\n')){printf("%c%d",a[i],temp);break;}
if ((j==8)&&((temp=a[i]-118)<=4)&&(a[i]!='\n')){printf("%c%d",a[i],temp);break;}
}
i++;
}
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: