习题3-1 分数统计
输入一些学生的分数,哪个分数出现的次数最多?如果有多个并列,从小到大输出。
任务1:分数均不超过100的非负整数
任务2:分数均不超过100的非负实数,但最多保留两位小数。
#include<stdio.h>
#include<string.h>
int score[1000+10];
int main()
{
int sum=0,temp;
int i=0,j=0,n=0;
int max=0;
int flag[100+10];
while((scanf("%d",&score[i++]))==1)
++sum;
for(i=0;i<sum;i++)
{
int count=1; //记录出现次数
num=score[i];
for(j=i+1;j<sum;j++)
{
if(score[j]==score[i])
count++;
}
if(count>=max)
{
if(count>max)
{
max=count;
memset(flag,0,sizeof(flag));
n=0;
flag[0]=score[i];
}
else
flag[++n]=score[i];
}
}
if(n==0)
printf("%d\n",flag[0]);
else //希尔排序(多个并列时
{
for(int gap=(n+1)/2;gap>0;gap/=2)
for(i=gap;i<=n;i++)
for(j=i-gap;j>=0&&flag[j]>flag[j+gap];j-=gap)
{
temp=flag[j];
flag[j]=flag[j+gap];
flag[j+gap]=temp;
}
for(i=0;i<=n;i++)
printf("%d ",flag[i]);
}
printf("\n");
return 0;
}
习题3-2 单词的长度
输出它们的平均长度。单词只包含大写字母和小写字母,用一个或多个空格隔开。
#include<stdio.h>
#include<string.h>
char buf[5000+10];
int main()
{
int count=1;
int sum=0;
fgets(buf,sizeof(buf),stdin);
for(int i=0;i<strlen(buf)-1;i++)
{
if(buf[i]==' ')
++count;
else
sum++;
}
printf("The average of size is %f.\n",(double)sum/(double)count);
return 0;
}
习题3-3 乘积的末三位
输入若干个单词,输入若干个整数(可以是正数、负数或者零),输出它们的乘积的末三位。这些整数中会混入一些由大写字母组成的字符串,你的程序应当忽略它们。提示:试试看,在执行scanf(“%d”)时输入一个字符串会怎样?
#include<stdio.h>
#include<string.h>
#define MAXN 1000+10
char a[MAXN];
int num[MAXN]={0};
int main()
{
int i,j;
int flag=0,symbol=0;
int mul=1;
fgets(a,sizeof(a),stdin);
for(i=j=0;i<strlen(a);i++)
{
if(a[i]=='-')
symbol=1;
else if(a[i]>='0'&&a[i]<='9')
{
num[j]=num[j]*10+(a[i]-'0');
flag=1;
}
else
{
if(flag==1)
{
if(symbol==1)
num[j]*=-1;
j++;
flag=0;
}
symbol=0;
}
}
for(i=0;i<j;i++)
mul*=num[i];
if(mul%1000!=0)
printf("The last three numbers are %d.\n",mul%1000);
else
printf("The last three numbers are 000.\n");
return 0;
}
习题3-4计算器
编写程序,读入一行恰好包含一个加号、减号或乘号的表达式,输出它的值。这个运算符保证是二元运算符,且两个运算符均为不超过100的非负整数。运算符和运算数可以紧挨着,也可以用一个或多个空格、TAB隔开。行末尾均可以有空格。提示:选择合适的输入方法可以将问题简化。
#include<stdio.h>
#include<string.h>
#define MAXN 1000+10
char a[MAXN];
int num[MAXN]={0};
int main()
{
int i,j,flag=0;
fgets(a,sizeof(a),stdin);
char ope;
for(i=j=0;i<strlen(a);i++)
{
if(a[i]>='0'&&a[i]<='9')
{
num[j]=num[j]*10+(a[i]-'0');
flag=1;
}
else
{
if(flag==1)
{
j++;
flag=0;
}
if(a[i]=='+'||a[i]=='-'||a[i]=='*')
ope=a[i];
}
}
switch(ope)
{
case '+':
printf("%d\n", num[0]+num[1]);break;
case '-':
printf("%d\n", num[0]-num[1]);break;
case '*':
printf("%d\n", num[0]*num[1]);break;
}
return 0;
}
习题3-5 旋转
输入一个n*n字符矩阵,把它左转90°后输出。
#include<stdio.h>
#include<string.h>
int main()
{
int i,j,n;
scanf("%d",&n);
int a[n][n];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
/*
ptrintf("The original:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%-3d",a[i][j]);
printf("\n");
}
*/
printf("The latter one:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%-3d",a[j][n-i-1]);
}
printf("\n");
}
return 0;
}
习题3-6 进制转换1
输入基数b(2<=b<=10)和正整数n(十进制),输出n的b进制表示。
#include<stdio.h>
#include<string.h>
int a[1000+10];
int main()
{
int b,n;
int i=0,j;
scanf("%d %d",&b,&n);
while(n>=1)
{
a[i++]=n%b;
n/=b;
}
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>
#include<string.h>
#include<math.h>
#define MAXN 1000+10
char n[MAXN];
int main()
{
int b;
int num=0;
int i,j;
scanf("%d %s",&b,n);
for(i=0,j=strlen(n);i<strlen(n);i++)
{
num+=(n[i]-'0')*pow(b,--j);
}
printf("%d",num);
return 0;
}
习题3-8 手机键盘
输入一个由小写字母组成的英文单词,输出用手机的默认英文输入法的敲键序列。例如要打出pig这个单词,需要按1次p,3次i,(稍作停顿后)1次i,记为p1i3i1。
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define MAXN 1000+10
char a[MAXN];
int main()
{
int i=0,temp,n;
scanf("%s",a);
n=strlen(a);
while(n--)
{
if((temp=a[i]-96)<=3) { printf("%c%d",a[i],temp); i++; continue;}
if((temp=a[i]-99)<=3) { printf("%c%d",a[i],temp); i++; continue;}
if((temp=a[i]-102)<=3) { printf("%c%d",a[i],temp); i++; continue;}
if((temp=a[i]-105)<=3) { printf("%c%d",a[i],temp); i++; continue;}
if((temp=a[i]-108)<=3) { printf("%c%d",a[i],temp); i++; continue;}
if((temp=a[i]-111)<=3) { printf("%c%d",a[i],temp); i++; continue;}
if((temp=a[i]-115)<=3) { printf("%c%d",a[i],temp); i++; continue;}
if((temp=a[i]-118)<=3) { printf("%c%d",a[i],temp); i++; continue;}
}
return 0;
}