习题3-1 分数统计(stat)
输入一些学生的分数,哪个分数出现的次数最多?如果有多个并列,从小到大输出。
任务1:分数均不超过100的非负整数
任务2:分数均不超过100的非负实数,但最多保留两位小数。
这个类似单词统计词频,按字典序输出频率最高的那些。
oj地址为: http://acm.dlut.edu.cn/problem.php?id=1132
任务一:
#include<stdio.h>
#include<string.h>
int a[100];
int main(void)
{
int max=0,n=0,x;
int t,m;
scanf("%d",&t);
for(m=0;m<t;m++)
{
int j,y,num=1,max_time=0,max_num=0;
scanf("%d",&y);
memset(a,0,sizeof(a));
for(j=0;j<y;j++)
{
scanf("%d",&x);
if(++a[x]>max_time) max_time=a[x]; //a[x]是x出现的 次数
if(x>max_num) max_num=x; //x是每次的成绩
}
for(int i=0;i<=max_num;i++)
{
if(a[i]==max_time&&num!=1)
printf(" %d",i);
else if(a[i]==max_time)
{
printf("%d",i);
num=0;
}
}
printf("\n");
}
}
任务二:
将输入的成绩*100,作为数组下标。
#include<stdio.h>
#include<string.h>
int a[10010];
int main(void)
{
int max=0,n=0;
int t,m;
scanf("%d",&t);
for(m=0;m<t;m++)
{
double d;int x;
int j,y,num=1,max_time=0,max_num=0;
scanf("%d",&y);
memset(a,0,sizeof(a));
for(j=0;j<y;j++)
{
scanf("%lf",&d);
x=(int)floor(d*100+0.5);
if(++a[x]>max_time) max_time=a[x]; //a[x]是x出现的 次数
if(x>max_num) max_num=x; //x是每次的成绩
}
int i;
for(i=0;i<=max_num;i++)
{
if(a[i]==max_time&&num!=1)
printf(" %.2lf",(double)i/100);
else if(a[i]==max_time)
{
printf("%.2lf",(double)i/100);
num=0;
}
}
printf("\n");
}
}
习题3-2 单词的长度(word)
输入若干个单词,输出它们的平均长度。单词只包含大写字母和小写字母,用一个或多个空格隔开。
oj地址: http://acm.dlut.edu.cn/problem.php?id=1133
#include<stdio.h>
#include<string.h>
char charactor[501];
int main(void)
{
int t,h;
int time=0;
scanf("%d",&t);
for(h=0;h<t;h++)
{
int len=0;
scanf("%d",&time);
int j;
for(j=0;j<time;j++)
{
scanf("%s",charactor);
len+=strlen(charactor);
}
printf("%.2lf",(double)len/time);
printf("\n");
}
}
习题3-3 乘积的末3位
输入若干个整数(可以是正数、负数或者零),输出它们的乘积的末3位。这些整数中会混入一些由大写字母组成的字符串,你的程序应该忽略它们。提示:试试看,在执行scanf("%d")时输入一个字符串会怎样?
没找到oj。不做了。。
讲下思路吧,用fgets函数输入一行。再用sscanf(s,"%s",str),将s分开多次存入str中,再分别处理。 然后,剔除字母转化成数字再乘,为了防止溢出可以((a%1000)*(b%1000))%1000。
习题3-4
编程程序读入一行恰好包括一个+或-或*的表达式,输出它的值。运算符保证是二元运算符,且两个运算数均不超过100的非负整数。运算数和运算符可以紧挨也可以有一个或多个空格、TAB隔开。行首尾均可以有空格。提示:选择合适的输入方法可以将问题简化。
#include <stdio.h>
#define N 1000
char str[N];
int main(void)
{
int op1, op2;
int p;
fgets(str, sizeof(str), stdin);//it will contains '\n';
for (p = 0; p <= strlen(str)-2; p++) {
if (str[p] == '+' || str[p] == '-' || str[p] == '*')
break;
}
switch(str[p]) {
case '+':
sscanf(str, "%d + %d", &op1, &op2);
printf("%d\n", op1+op2);
break;
case '-':
sscanf(str, "%d - %d", &op1, &op2);
printf("%d\n", op1-op2);
break;
case '*':
sscanf(str, "%d * %d", &op1, &op2);
printf("%d\n", op1*op2);
break;
}
return 0;
}
习题3-5 旋转
输入一个n*n字符矩阵,把它左旋90度后输出
类似的oj:http://acm.dlut.edu.cn/problem.php?id=1127
#include <stdio.h>
int num[101][101];
int main(void)
{
int n,m;
while(scanf("%d%d",&n,&m))
{
if(n==0&&m==0) break;
int i,j;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
scanf("%d",&num[i][j]);
}
for(j=0;j<m;j++)
for(i=n-1;i>=0;i--)
{
if(i==n-1)
printf("%d",num[i][j]);
else
printf(" %d",num[i][j]);
if(i==0) printf("\n");
}
printf("\n");
}
return 0;
}
习题3-6 进制转换1
输出基数b( 2 <= b <= 10)和正整数n(十进制),输出n的b进制表示
#include <stdio.h>
int num[101][101];
int main(void)
{
int n,m;
while(scanf("%d%d",&n,&m))
{
if(n==0&&m==0) break;
int i,j;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
scanf("%d",&num[i][j]);
}
for(j=0;j<m;j++)
for(i=n-1;i>=0;i--)
{
if(i==n-1)
printf("%d",num[i][j]);
else
printf(" %d",num[i][j]);
if(i==0) printf("\n");
}
printf("\n");
}
return 0;
}
习题3-7 进制转换2
输出基数b( 2 <= b <= 10)和正整数n(b进制),输出n的十进制表示注意:10进制的9999999999溢出int
#include <stdio.h>
#include<math.h>
//int res[100];
char num[11];
int main(void)
{
int t;
scanf("%d",&t);
while(t>0)
{
t--;
int b,n;
scanf("%d%s",&b,num);
int i,j;
long long x=0,tem=0;
for(i=0;i<10;i++)
{
tem=(long long)pow(b,9-i);
x+=tem*(num[i]-'0');
}
printf("%lld\n",x);
}
return 0;
}
习题3-8 手机键盘
略