算法竞赛经典入门第三章习题

习题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 手机键盘
























  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值