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");
}
}