算法题总结

算法题

1.汉字统计

统计给定文本文件中汉字的个数

  • Input:
    输入文件首先包含一个整数n,表示测试实例的个数,然后是n段文本。
  • Output:
    对于每一段文本,输出其中的汉字的个数,每个测试实例的输出占一行。
  • Sample Input:
    2
    WaHaHa! WaHaHa! 今年过节不说话要说只说普通话WaHaHa! WaHaHa!
    马上就要期末考试了Are you ready?
  • Sample Output:
    14
    9
  • 思路:
  1. 需给定足够大的字符数组
  2. 汉字采用扩展编码,一个汉字占用2个字节
  3. 汉字的内码为负值
  4. 所以计算汉字的个数只需找到字符串中小于0的字符个数并除以二。
#include<stdio.h>
#include<string.h>
int main()
{
    int n, i, count, j;
    char A[1000];
    while (scanf("%d", &n) != EOF)
    {
        getchar();
        for (i = 0; i < n; i++)
        {
            count = 0;
            gets(A);
            for (j = 0; j < strlen(A); j++)
            {
                if (A[j] < 0) count++;
            }
            printf("%d\n", count / 2);
        }
    }
}

2. 母牛的故事

有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?

  • Input:
    输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0< n< 55),n的含义如题目中描述。
    n=0表示输入数据的结束,不做处理。
  • Output:
    对于每个测试实例,输出在第n年的时候母牛的数量。
    每个输出占一行。
  • Sample Input:
    2
    4
    5
    0
  • Sample Output:
    2
    4
    6
  • 思路:
  1. 根据题目定义一个足够大的数组
  2. 通过题目计算每年母牛的数量,并找出其中的规律
1,    2,    3,    4,    4+2,   6+3
A[0]  A[1]  A[2]  A[3]  A[4]   A[5]
  • 当i<=2时,A[i] = A[i - 1] + 1;
  • 当i>2时,A[i] = A[i - 1] + A[i - 3];
  1. 根据找出的规律,通过循环,将55年内的母牛数量储存在数组中
  2. 最终根据输入数据将结果打印
#include<stdio.h>
int main()
{
    int n ,i;
    int A[55];
    A[0] = 1;
    for (i = 1; i < 55; i++)
    {
        if (i <= 2) A[i] = A[i - 1] + 1;
        else     
        {        
            A[i] = A[i - 1] + A[i - 3];
        }
    }
    while (scanf("%d", &n) != EOF)
    {
        if (n == 0) break;
        else
        {
            printf("%d\n", A[n - 1]);
        }
    }
}

3.字符串统计

对于给定的一个字符串,统计其中数字字符出现的次数

  • Input:
    输入数据有多行,第一行是一个整数n,表示测试实例的个数,后面跟着n行,每行包括一个由字母和数字组成的字符串。
  • Output:
    对于每个测试实例,输出该串中数值的个数,每个输出占一行。
  • Sample Input:
    2
    asdfasdf123123asdfasdf
    asdf111111111asdfasdfasdf
  • Sample Output:
    6
    9
  • 思路:
  1. 预定义一个字符串数组
  2. 根据题目得到如果是数字,则应满足’0’ <= A[i] <= ‘9’
  3. 当满足条件时,计数器加一
#include <stdio.h>
#include <string.h>
int main()
{
    int n, i, sum;
    char A[100];
    while (scanf("%d", &n) != EOF)
    {
        getchar();
        while (n>0)
        {
            gets(A);
            for (i = 0, sum = 0; i < strlen(A); i++)
            {
                if (A[i] >= '0' && A[i] <= '9')
                    sum++;
            }
            n--;
            printf("%d\n", sum);
        }
    }
    return 0;
}

4.偶数求和

有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。编程输出该平均值序列。

  • Input:
    输入数据有多组,每组占一行,包含两个正整数n和m,n和m的含义如上所述。
  • Output:
    对于每组输入数据,输出一个平均值序列,每组输出占一行。
  • Sample Input:
    3 2
    4 2
  • Sample Output:
    3 6
    3 7
  • 思路:
  1. 先求出长度为n的数列,有几组m个数,即n/m
  2. 再求出最后一组不足m个的实际数量,即n%m
  3. 根据等差数列求和公式,先算出每m个数的平均值
  4. 最后算n%m个数的平均值,依旧根据等差数列求和公式,算出和
#include<stdio.h>
int main(){
	int n,m;
	while(scanf("%d %d",&n,&m) != EOF)
       {
		int q,p;
		q=n/m;
		p=n%m;
		printf("%d",(2+2*m)/2); 
		for(int i=1;i<q;i++)
			printf(" %d",(2+2*m)/2+2*m*i); 
		if(p!=0)                                  
			printf(" %d",(2*m*q+2+2*m*q+2*p)/2); 
		printf("\n");
	}
	return 0;
}

5. 水仙花数

春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=13+53+3^3。
现在要求输出所有在m和n范围内的水仙花数。

  • Input:
    输入数据有多组,每组占一行,包括两个整数m和n(100<=m<=n<=999)。
  • Output:
    对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;
    如果给定的范围内不存在水仙花数,则输出no;
    每个测试实例的输出占一行。
  • Sample Input:
    100 120
    300 380
  • Sample Output:
    no
    370 371
  • 思路:
  1. 根据题目将符合水仙花数的数通过if语句找出if(aaa+bbb+ccc==i)
    a,b,c分别为三位数i的个位十位百位
  2. 只要在区间m,n中找到一个水仙花数,则将found值改为1,标志在区间中找到水仙花数
  3. 最后控制输出格式,将答案输出
#include <stdio.h>
int main(){
	int m,n,i,a,b,c,found=0;
	while(scanf("%d %d",&m,&n)!=EOF)
      {
		for(i=m;i<=n;i++)
                {
			a=i%10;
			b=i/100;
			c=(i-b*100)/10;
			if(a*a*a+b*b*b+c*c*c==i)
                        {
                                if(found==1)printf(" ");
				printf("%d",i);
				found=1;
			} 
		}
		if(found==0) printf("no\n");
		else printf("\n");
		found=0;
	}
	return 0;
} 

6.第几天?

给定一个日期,输出这个日期是该年的第几天。

  • Input:
    输入数据有多组,每组占一行,数据格式为YYYY/MM/DD组成,具体参见sample input ,另外,可以向你确保所有的输入数据是合法的。
  • Output:
    对于每组输入数据,输出一行,表示该日期是该年的第几天。
  • Sample Input:
    1985/1/20
    2006/3/12
  • Sample Output:
    20
    71
  • 思路:
  1. 先判断输入的年份是否为闰年,若为闰年则二月为29天,若不是闰年,则二月为28天
  2. 再计算出输入月份之前的所有月份天数的总和,最后加上输入的天数
  3. 最终控制输出格式打印结果
#include<stdio.h>
int main()
{
    int day,month,year,i,sum=0;
    char a;
    while(scanf("%d/%d/%d",&year,&month,&day)!=EOF)
    {
        sum=0;
        if(year%400==0||(year%4==0&&year%100!=0))
        {
            for(i=1;i<month;i++)
            {
                if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)
                {
                    sum+=31;
                }
                else if(i==4||i==6||i==9||i==11)
                {
                    sum+=30;
                }
                else sum+=29;
            }
            sum=sum+day;
        }
        else
        {
            for(i=1;i<month;i++)
            {
                if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)
                {
                    sum+=31;
                }
                else if(i==4||i==6||i==9||i==11)
                {
                    sum+=30;
                }
                else sum+=28;
            }
            sum=sum+day;
        }
        printf("%d\n",sum);
    }
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值