您的位置:首页 > 编程语言

算法竞赛入门经典,练习代码 ,3.4.9 上机练习

2016-01-31 10:42 701 查看
习题3-1 分数统计(stat)

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

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

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

#include <stdio.h>
#define MAX=1000
int main()
{
int a[101];
int x,i;
memset(a,0,sizeof(a));//memset第三个参数是数组的大小,不是个数
while(scanf("%d",&x)!=EOF)
a[x]++;
int max=0;
for(i=0;i<=100;i++)
if(a[i]>=max)
{
max=a[i];
}
for(i=0;i<=100;i++)
if(a[i]==max)
{
printf("%d\n",i);
}
return 0;
}


#include <stdio.h>
#include <math.h>
int main()
{
int a[10010]={0};//可直接全部赋值
int i;
double x;
// double k;
int max=-1;
// memset(a,0,sizeof(a));//memset第三个参数是数组的大小,不是个数
int n=0;//存放最大输入的数*100
int y;//存x*100
while(scanf("%lf",&x)!=EOF)
{
y=(int)floor(x*100);
a[y]++;//floor向下取整,不然double型运算可能不正确
if(a[y]>=max)
{
max=a[y];
}
if(n<=y)
n=y;
}
//printf("%d\n",max);
for(i=0;i<=n;i++)
if(a[i]==max)
{
//k=i/100+i%100/10*0.1+i%100%10*0.01;//一定要用一个double类型接收,不能直接输出,那样不能类型转换
printf("%.2lf\n",(double)i/100 );//转化类型后可输出
}
return 0;
}


习题3-2 单词的长度(word)

输入若干个单词,输出它们的平均长度。单词只包含大写字母和小写字母,用一个或多个空格隔开。
#include <stdio.h>
#define MAX 1000
int main()
{
char a[MAX];
int i,count=0,flag=1,n=0;
double x;
gets(a);
for(i=0;i<strlen(a);i++)
{
if((a[i]>='a'&&a[i]<='z')||(a[i]>='A'&&a[i]<='Z'))
{
count++;
if(flag==1)
{
n++; flag=0;
}
}
else{
flag=1;
}
}
//printf("%d   %d\n",count,n);
x=1.0*count/n;
printf("%lf\n",x);
return 0;
}


习题3-3 乘积的末3位

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

scanf("%d",&a);
这语句只从输入缓冲区接收数字,输入字符时就不会接收,输入的字符永远在缓冲区内。

#include<stdio.h>
int main()
{
int a=0;
long long ans=1;
char c;
while((c=getchar())!=EOF)
{
if(isdigit(c))
a=a*10+c-'0';
else if(c==' ')
{   ans*=a;
a=0;
}
if(ans==0) break;
}
ans*=a;
printf("%3lld\n",ans%1000);
return 0;
}


习题3-4

编程程序读入一行恰好包括一个+或-或*的表达式,输出它的值。运算符保证是二元运算符,且两个运算数均不超过100的非负整数。运算数和运算符可以紧挨也可以有一个或多个空格、TAB隔开。行首尾均可以有空格。提示:选择合适的输入方法可以将问题简化。
#include<stdio.h>
int main()
{
int a=0,b=0,out;
char c;
scanf("%d",&a);
c=getchar();
while(c!='+'&&c!='-'&&c!='*')
{
c=getchar();
}
scanf("%d",&b);
if(c=='+')out=a+b;
else if(c=='-')out=a-b;
else if(c=='*')out=a*b;
printf("%d\n",out);
return 0;
}


#include <stdio.h>
#define N 1000

char str
;

int
main(void)
{
char *p = NULL;
int op1, op2;

fgets(str, sizeof(str), stdin);//it will contains '\n';

for (p = str; *p != '\n'; p++) {
if (*p == '+' || *p == '-' || *p == '*')
break;
}
if (*p != '\n'){
switch(*p) {
case '+':
sscanf(str, "%d + %d", &op1, &op2);// <span style="font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 21px;">sscanf() - 从一个字符串中读进与指定格式相符的数据.</span>
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;
}
注意"%d + %d"这个+号两边必须有空格才会吃掉诸如3 +1这种情况

习题3-5 旋转

输入一个n*n字符矩阵,把它左旋90度后输出
#include <stdio.h>
#define MAX 100
int main()
{
char a[MAX][MAX];
int i=0,j=0,n=0;
char c;
do
{
n=0;
while((c=getchar())!='\n')
{

a[i][j]=c;
n++;
j++;
}
i++;
j=0;
}
while(i<n);
for(i=(n-1);i>=0;i--)
{
for(j=0;j<n;j++)
printf("%c",a[j][i]);
printf("\n");
}
}

getchar()是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,也就是说,如果stdin有数据的话不用输入它就可以直接读取了,第一次getchar()时,确实需要人工的输入,但是如果你输了多个字符,以后的getchar()再执行时就会直接从缓冲区中读取了。
实际上是 输入设备->内存缓冲区->程序getchar


习题3-6 进制转换1

输出基数b( 2 <= b <= 10)和正整数n(十进制),输出n的b进制表示
#include <stdio.h>
int main()
{
int b,n,i=0;
int a[100];
scanf("%d %d",&b,&n);
do{
a[i]=n%b;
n=n/b;
i++;
}
while(n>0);
i--;
while(i>=0)
{
printf("%d",a[i]);
i--;
}
printf("\n");
}

递归版本:

#include <stdio.h>

void trans(int n, int b)
{
if (n >= b)
trans(n/b, b);
printf("%d", n%b);
}

int main(void)
{
int b, n;
scanf("%d %d", &b, &n);
trans(n, b);
printf("\n");
return 0;
}


习题3-7 进制转换2

输出基数b( 2 <= b <= 10)和正整数n(b进制),输出n的十进制表示
#include <stdio.h>
#include <math.h>
int main()
{
int b,i=0,x,out=0;
char n[100];
scanf("%d %s",&b,&n);
x=strlen(n);
for(i=0;i<x;i++)
{
out=out+(n[i]-'0')*pow(b,x-i-1) ;
}
printf("%d\n",out);
}


习题3-8 手机键盘

输入一个有小写字母组成的英文单词,输入用手机的默认英文输入法的键盘序列。例pig,需按1次p,3次i,1次g,记为p1i3g1.

#include <stdio.h>
#include <math.h>
int main()
{
char a[8][4]={"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
char c;
int i,j;
while((c=getchar())!='\n')
{
for(i=0;i<8;i++)
for(j=0;j<4;j++)
{
if(c==a[i][j])
printf("%c%d",c,j+1);
}
}
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: