[蓝蓝计算机考研算法训练二期]-day02

132 阅读2分钟

3、计算字符串中含有不同字符的个数。

编写一个函数,计算字符串中含有的不同字符的个数。字符在ASCII码范围内(0~127,包括0和127),换行表示结束符,不算在字符里。不在范围内的不做统计。多个相同的字符只计算一次。

例如,对于字符串abaca而言,有a、b、c三种不同的字符,因此输出3。

数据范围:1 <= n <= 500

输入描述

输入一行没有空格的字符串。

输出描述:

输入字符串中范围在(0~127,包括0和127)字符的种数。如:

输入:
abc
输出:
3
输入:
aaa
输出:
1

思路

给定了输入的字符个数的范围,则可以使用字符来进行存储所输入的内容。又因为字符在ASCII码范围内(0~127,包括0和127),所以可以设置一个长度为128的ASCII码值的数组(驻足初始值置为0),依次将所输入的字符的ASCII码值在该数组中进行匹配,若匹配到且该位置的值为0,则置1,同时计数种类的变量自增1。本算法采取以空间换时间的思想,一次循环完成计数。

具体实现

#include<stdio.h>
#include<string.h>
int main(){
    //数据范围是1~500,申请一个500长度的字符数组 
    char x[500];
    //声明一个大小为128的整形数组,初始化都为0 
    int a[128] = {0};
    //用于获取字符长度,方便从头到尾进行遍历 
    int n1;
    //获取总的字符种数
    int n2 = 0; 
    //获取字符的ASCII码值 
    int c;
    //调用方法获取输入的字符
    gets(x);
    n1 = strlen(x);
    for(int i=0; i<n1; i++){
        //字符强转获取ASCII码值 
        c = (int)x[i];
	if(a[c] == 0){
            a[c] = 1;
            n2++;
            }
	}
    printf("%d\n", n2);
    return 0;
}

01.png

02.png

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

方法一

思路

将第一个数a乘从1开始的整数i,直到能够整除另一个数b为止,最小公倍数就是a* i。

具体实现

#include <stdio.h>
int main()
{
    int a, b;
    scanf("%d %d", &a, &b);
    int i = 1;
    while(1){
        if(a*i%b == 0)
            break;
        i++;
    }
    printf("%d和%d的最小公倍数是%d\n", a, b, a*i);
}

03.png

方法二

思路

先求出最大公约数,再用最大公约数求出最小公倍数。

具体实现

#include <stdio.h>
int main()
{
    int a, b, c;
    c = 0;
    scanf("%d %d", &a, &b); 
    c = a % b;
    //记录a、b 
    int m = a;
    int n = b;
    //求出a、b的最大公约数 
    while (c){
        a = b;
        b = c;
        c = a % b;
    }
    printf("%d和%d的最小公倍数是%d\n", a, b, m*n/b);
}

04.png

小结

经过今天的算法练习中,第一个算法有数据类型的转换以及利用数组的随机存取特性可以减少循环轮数来减少时间上的消耗,第二个算法则是对数学中,数字之间的关系进行多一步的研究来减少循环的次数求最小公倍数。在编写的过程中,发现在一些库函数方法的运用上还是有所欠缺以及数学上还仍有需要进步的地方。