“开启掘金成长之旅!这是我参与「掘金日新计划 · 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;
}
示例
题目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;
}
示例
总结
在写第一题的时候还是有很多地方要注意的,在判断字符是否合法时需要强制转换成int型; 还有就是不能直接在a上减减,这要导致每次循环a的值都不一样,从而会多减很多;还有注意的是break必须加上,不加则会重复累加。 总之,发现不对,可以通过调试来一步一步看在哪一步出错了,不能怕出错,出错要能找到错误才是最大的收获。