声明:摘选自“ 算法竞赛入门经典(第2版)”作者: 刘汝佳 / 陈锋 ISBN:9787302291077
数数字
把前N(n≤10000)个整数顺次写在一起:123456789101112 ...数一数0〜9各出现多少次(输出10个整数,分别是0,1,...,9出现的次数)。
解题思路:
如果一次性输入1-20个,即1234567891011121314151617181920,计算机不可能一次性体处理这么大的数据量,所以通过不断取余数从而获得个位数来计数的方法就不可靠了,如果我们可以一边输入一边处理数据,这样既可以达到实时性,又能够节约资源.getchar()函数可以帮助我们完成这个工作。首先我们需要导入<string.h>的这个库。然后利用而循环不断读取输入的数字,直到遇见换行符“\ n”(windows系统)就结束循环,输出计数。这个程序非常简单,只要你能够想到使用getchar()函数来处理
#include<stdio.h>
#include<string.h> //为了使用getchar()函数
int main()
{
int c, list[11]; // list[]用于存放0-9各个数字的个数
memset(list, 0, sizeof(list)); //将存放整数的数组初始化归零
while((c=getchar()) && (c!='\n')) //使用getchar()函数可以边输入边处理,否则数值太大不能一次性处理
{
list[c-'0'] ++; //如果输入的不是回车键(windowsxitong)就不断循环处理,否则退出
//获得的c是输入字符的ASCII码,需要将其减去‘0’获得其真正的数值
}
for(int i=0; i<=9; i++) printf("%d ", list[i]); //将0-9所有数字的个数打印出来
}
周期串
如果一个字符串可以由某个长度为k的字符串重复多次得到,则称该串以k为周期。例如,abcabcabcabc以3为周期(注意,它也以6和12为周期)。输入一个长度不超过80的字符串,输出其最小周期。
解题思路:
我们采用环形字符串的思想,依次以字符串的字母为开始,创建len(字符串长度)个首尾相连的字符,如果第n个字符串与原始字符串完全相等,说明字符串的最小周期就是N;如图所示:
#include<stdio.h>
#include<string.h>
int main()
{
char c[90]; //定义一个字符串数组来存储环形字符串
char s[90]; //用于存储输入字符串
scanf("%s",s);
int len = strlen(s); //计算有多少个字符,strlen()函数来自string.h库
for(int i=0; i<len; i++) //利用环形字符串将字符循环存储
{
int n = i, m=0; //n是充当指针作用记录存储的第一个字符在s数组的位置,m是一个标志位,为了判断新数组是否等于原数组
for(int j=0; j<len; j++) //利用for循环,将数组按照环形数组存储到新的数组,
{
if(n+2 > len) n= -1; //如果n+2大于len说明已经超出原数组长度,那么就重置将n=-1,从头开始继续读取原数组,直到读满len个长度
c[j] = s[n+1];
n++;
}
for(int j=0; j<len; j++) //依次将新数组与原数组单个元素比较,如果全部都相等,那么就说明这个新数组的i就是最小周期
{
if(c[j] != s[j]) m = 1; //其实可以直接两个字符串比较,会更简单,但是我的字符串总是在串尾打印“齜",所以我只能单个元素比较了
}
if(m == 0)
{
printf("%d", i+1); //如果标志位m为0,说明现在就是最小周期,那么就打印周期数 i+1
return 0;
}
}
return 0;
}