算法的乐趣c/c++ —— 1.1.8入门习题

声明:摘选自“  算法竞赛入门经典(第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;
} 

猜你喜欢

转载自blog.csdn.net/lpp5406813053/article/details/84843616
今日推荐