算法练习-day02统计字符串中字符种类的个数和求两数的最小公倍数

137 阅读2分钟

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情

题目1

编写一个函数,计算字符串中含有的不同字符的个数。字符在ASCI码范围内(0~127,包括0和127),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次例如,对于字符串abaca而言,有a、b、c三种不同的字符,因此输出3。数据范围:1<=n<=500

输入描述 输入一行没有空格的字符串。 输出描述: 输入字符串中范围在(0~127,包括0和127)字符的种数。输入:

思路

————————————————————

先获取字符串的长度,如果字符串内没有重复的字符,则字符串的长度就等于字符的个数 第二种情况就是有重复的,那么就循环遍历字符,有相同的则长度减一从而获得字符的个数

算法实现

#include <stdio.h>
//先获取字符串的长度,如果字符串内没有重复的字符,则字符串的长度就等于字符的个数
//第二种情况就是有重复的,那么就循环遍历字符,有相同的则长度减一从而获得字符的个数
int main()
{
	char s[500];//定义一个可以存放500个字符的数组
	int len;//定义一个整形变量存储字符串的长度
	int a;//存储字符的个数
	int n=0;//计数减了多少次
	gets(s);//从键盘获取字符串
	len = strlen(s);//获取字符串的长度
	a = len;//开始字符串的大小就是字符的个数
	for (int i = 0; i <= a; i++)//遍历每一个字符
	{
		if ((int)s[i]=='0')//判断字符是否是否在0--127
		{
			break;
		}
		for (int j =(i+ 1); j < a; j++)
		{
			if (s[i] == s[j])
			{
				n++;//此处不能a--,因为在这里改变a的之后跳到第一个循环就不是按原来长度算了
				break;//一定要加break否则会重复计数
			}
		}
	}
	printf("该字符串的字符种类个数为%d", (a-n));
	return 0;
}

示例

image.png

image.png

题目2

从键盘输入两个数字n,m,求解n和m的最小公倍数。

思路

————————————————————

求最小公倍数,先求两数的最大公约数,最小公倍数就等于两数的乘积除以最大公约数 所以我们可以先用辗转相除法求两数的最大公约数

算法实现

int main()
{
	int m,n;
	int z = 0;
	printf("请输入两个整数:");
	scanf("%d%d", &m, &n);//从键盘获取两个数字m,n
	int s = m * n;
	int c;//用来接两数最大公约数
	while (z = m % n)//这里我们不需要去判断哪个数大哪个数小,如果后者大,下面也会将后者复制给前者再循环
	{
		m = n;
		n = z;
	}
	printf("最大公约数是:%d\n", n);
	printf("最小公倍数是:%d\n", s / n);
	return 0;
}

示例

image.png

总结

在写第一题的时候还是有很多地方要注意的,在判断字符是否合法时需要强制转换成int型; 还有就是不能直接在a上减减,这要导致每次循环a的值都不一样,从而会多减很多;还有注意的是break必须加上,不加则会重复累加。 总之,发现不对,可以通过调试来一步一步看在哪一步出错了,不能怕出错,出错要能找到错误才是最大的收获。