杭电OJ第11页2015~2019算法题(C语言)

2015.偶数求和

Problem Description
有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个
数求出一个平均值,如果最后不足m个,则以实际数量求平均值。编程输出该平均值序列。
Input
输入数据有多组,每组占一行,包含两个正整数n和m,n和m的含义如上所述。
Output
对于每组输入数据,输出一个平均值序列,每组输出占一行。
Sample Input
3 2
4 2
Sample Output
3 6
3 7

分析:先计算前面[n-(n%m)]/m组的平均值,若n%m!=0,则说明最后一组不足m个,再单独进行计算即可。当n<m时,最后一组就是第一组,该组的元素个数不足m,同样适合上面的解法。

#include <stdio.h>

void EvenNumSum(){
	int n,m,i,j,sum;
	int arr[100];
	arr[0]=2;
	for(i=1;i<100;i++) arr[i]=arr[i-1]+2;
	while(scanf("%d%d",&n,&m)!=EOF){
		if(n<=0 || n>100){
			printf("n的取值为1~100!请重新输入!\n");
			continue;
		}
		if(m<=0){
			printf("m为正整数!请重新输入!\n");
			continue;
		}		
		//循环[n-(n%m)]/m次 
		for(i=0;i<n-(n%m);i+=m){
			sum=0;
			for(j=i;j<i+m;j++){
				sum+=arr[j];
			}
			printf("%d ",sum/m);
		} 
		//如果最后不足m个,则以实际数量求平均值
		if(n%m!=0){
			sum=0;
			for(j=i;j<i+n%m;j++){
				sum+=arr[j];
			}
			printf("%d ",sum/(n%m));
		}
		printf("\n");
	}
}

2016.数据的交换输出

Problem Description
输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数。
Input
输入数据有多组,每组占一行,每行的开始是一个整数n,表示这个测试实例的数值的个数,跟着就是
n个整数。n=0表示输入的结束,不做处理。
Output
对于每组输入数据,输出交换后的数列,每组输出占一行。
Sample Input
4 2 1 3 4
5 5 4 3 2 1
0
Sample Output
1 2 3 4
1 4 3 2 5

分析:在查找最小值的过程中,可以用index来记录其下标。

#include <stdio.h>

void ExchangePrintf(){
	int n,i,temp,index;
	int arr[100];
	while(scanf("%d",&n)!=EOF){
		if(n==0) break;
		if(n<0 || n>=100){
			printf("n的取值范围为[0,100)之间的整数!请重新输入!\n");
			continue;
		}
		//将输入的n个数存到arr数组中
		for(i=0;i<n;i++) {
			scanf("%d",&arr[i]);
		}
		temp=arr[0];
		//index用来记录最小元素的数组下标 
		index=0;
		for(i=1;i<n;i++){
			if(arr[i]<temp){
				temp=arr[i];
				index=i;
			}
		}
		//将最小值与arr[0]交换
		temp=arr[index];
		arr[index]=arr[0];
		arr[0]=temp;
		for(i=0;i<n;i++){
			printf("%d ",arr[i]);
		}
		printf("\n");
	}
}

2017.字符串统计

Problem Description
对于给定的一个字符串,统计其中数字字符出现的次数。
Input
输入数据有多行,第一行是一个整数n,表示测试实例的个数,后面跟着n行,每行包括一个由字母和
数字组成的字符串。
Output
对于每个测试实例,输出该串中数值的个数,每个输出占一行。
Sample Input
2
asdfasdf123123asdfasdf
asdf111111111asdfasdfasdf
Sample Output
6
9

分析:由于C语言没有string类型,所以可以考虑使用字符数组来处理字符串。

#include <stdio.h>
#include <string.h>

void StringStatistics(){
	int n,count,i,length;
	char str[1000];
	scanf("%d",&n);
	getchar();
	while(n--){
		gets(str);
		count=0;
		//计算该字符串的长度
		length=strlen(str);
		for(i=0;i<length;i++){
			if(str[i]>='0' && str[i]<='9')  {
				count++;
			}
		}
		printf("%d \n",count);
	}
}

2018.母牛的故事

Problem Description
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。
请编程实现在第n年的时候,共有多少头母牛?
Input
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中
描述。
n=0表示输入数据的结束,不做处理。
Output
对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行。
Sample Input
2
4
5
0
Sample Output
2
4
6

分析:用arr[i]来表示第i年母牛的数量,则当4<=i<=54时,满足arr[i]=arr[i-1]+arr[i-3],根据该递推式可以编写对应的算法。

#include <stdio.h>

void Cows(){
	int i,n;
	//arr[i]表示第i年母牛的数量 
	int arr[56]={0,1,2,3,4};
	for(i=5;i<=55;i++){
		arr[i]=arr[i-1]+arr[i-3];
	}
	while(scanf("%d",&n)!=EOF){
		if(n<=0 || n>=55){
			printf("n的取值范围为(0,55)之间的整数!\n");
			continue;
		}
		printf("%d\n",arr[n]);
	}
}

2019.数列有序

Problem Description
有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列
中,并使新的序列仍然有序。
Input
输入数据包含多个测试实例,每组数据由两行组成,第一行是n和m,第二行是已经有序的n个数的数
列。n和m同时为0标示输入数据的结束,本行不做处理。
Output
对于每个测试实例,输出插入新的元素后的数列。
Sample Input
3 3
1 2 4
0 0
Sample Output
1 2 3 4

分析:将m插入原数列中并使得新的数列仍然有序,可有一下两种思路:
(1)先将m直接插入数列末尾,然后再对整个数列进行排序即可
(2)先找到m应该插入的位置,然后将m后面的元素全部往后移动一位,不过需要考虑两种特殊情况,一是m大于等于数列中的所有值,二是m小于等于数列中的所有值。下面的算法利用的是第二种思路。

#include <stdio.h>

void SequenceOrder(){
	int arr[101];
	int i,n,m,index=0;
	while(scanf("%d%d",&n,&m)!=EOF){
		if(n==0 && m==0){
			break;
		}
		if(n<=0 || n>100){
			printf("n的取值范围为(1,100)之间的整数!\n");
			continue;
		}
		for(i=0;i<n;i++){
			scanf("%d",&arr[i]);
		}
		/*
		考虑两种特殊情况:
		(1)m>=arr[n-1],直接将m赋值给arr[n] 
		(2)m<=arr[0],将全部元素往后移动一位,并将m赋值给arr[0] 
		*/	
		if(m>=arr[n-1]){
			arr[n]=m;
		}else{
			for(i=0;i<n-1;i++){
				if(m>=arr[i] && m<=arr[i+1]){
					index=i+1;
					break;
				}
			}
			//将剩余的元素全部往后移动一位 
			for(i=n;i>(index==0?-1:index-1);i--){
				arr[i+1]=arr[i];
			}
			arr[index==0?0:index]=m;
		}
		//输出所有元素 
		for(i=0;i<=n;i++){
			printf("%d ",arr[i]);
		}
		printf("\n");
	}
}

杭电OJ第11页2020~2024算法题(C语言)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值