算法题
1.汉字统计
统计给定文本文件中汉字的个数
- Input:
输入文件首先包含一个整数n,表示测试实例的个数,然后是n段文本。 - Output:
对于每一段文本,输出其中的汉字的个数,每个测试实例的输出占一行。 - Sample Input:
2
WaHaHa! WaHaHa! 今年过节不说话要说只说普通话WaHaHa! WaHaHa!
马上就要期末考试了Are you ready? - Sample Output:
14
9 - 思路:
- 需给定足够大的字符数组
- 汉字采用扩展编码,一个汉字占用2个字节
- 汉字的内码为负值
- 所以计算汉字的个数只需找到字符串中小于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, 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];
- 根据找出的规律,通过循环,将55年内的母牛数量储存在数组中
- 最终根据输入数据将结果打印
#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 - 思路:
- 预定义一个字符串数组
- 根据题目得到如果是数字,则应满足’0’ <= A[i] <= ‘9’
- 当满足条件时,计数器加一
#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 - 思路:
- 先求出长度为n的数列,有几组m个数,即n/m
- 再求出最后一组不足m个的实际数量,即n%m
- 根据等差数列求和公式,先算出每m个数的平均值
- 最后算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 - 思路:
- 根据题目将符合水仙花数的数通过if语句找出if(aaa+bbb+ccc==i)
a,b,c分别为三位数i的个位十位百位 - 只要在区间m,n中找到一个水仙花数,则将found值改为1,标志在区间中找到水仙花数
- 最后控制输出格式,将答案输出
#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 - 思路:
- 先判断输入的年份是否为闰年,若为闰年则二月为29天,若不是闰年,则二月为28天
- 再计算出输入月份之前的所有月份天数的总和,最后加上输入的天数
- 最终控制输出格式打印结果
#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);
}
}