day02

73 阅读2分钟

day01改进:

完数可以用欧拉公式:

如果一个数n为质数,并且2^n-1为质数,那么(2^n-1)*2^(n-1)为完全数。

用时3h .....

  1. 计算字符串中含有的不同字符的个数

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

思路:

  • 知识补充:

    • 0表示空格
    • 127表示删除
    • 换行符的ASCII码对应十进制为10.
  • 思路1

    1. 逐个输入字符串中的字符
    2. 统计所有字符的个数
    3. 将每个字符对应的值填入相关数组的下标。
    4. 遇到换行符就结束

具体实现:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int main()
{
    int n=0;
    bool str[128]={false};
    char ch;

    while((ch=getchar())!='\n')
    {
        n++;
        if(n<1||n>500)
        {
            printf("个数不符合规定!");
            exit(0);
        }

        int i=ch-1;
        str[i]=true;
    }

    int sum=0;
    int i;
    for(i=0;i<128;i++)
    {
        if(str[i]==true)
            sum++;
    }

    printf("%d",sum);

    return 0;
}

难点:

  • 不会输入连续字符串
        while((ch=getchar())!=EOF)
    {
       n++;
       if(n<1||n>500)
       {
           printf("个数不符合规定!");
           exit(0);
       }
    
       int i=ch-1;
       printf("%d ",i);
       str[i]=true;
    }
    
    在循环内出不来
    为什么呢?
    因为ch=getchar()虽然返回的是int型,但是不对应十进制。
    getchar(),putchar(),因此ch仍需要与char型的进行比较
    

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

思路:

  • 最大公约数和最小公倍数的含义。
    • 最大公约数是两个数都能整除的最大值。
    • 最小公倍数是两个数共有的倍数的最小值。
  • 思路1
    • 最小公倍数=两个数的乘积/最大公约数
    • 最大公约数利用辗转相除法。大数除小数,余数找除数。

image.png

或者利用图形理解

image.png

  • 使用循环

    • (a,b)=(b,a%b)
    • 设a,设b,设r 若r不为0,a=b,b=r;r=a%b 最后当r为0 返回b
  • 利用递归

具体实现:

int GCD(int n,int m)
{
    int a,b;
    if(n>m)
    {
        a=n;
        b=m;
    }
    else
    {
        a=m;
        b=n;
    }

        int r=a%b;
        while(r!=0)
        {
            a=b;
            b=r;
            r=a%b;
        }
        return b;
}
int GCD1(int a,int b)
{
    return b?GCD1(b,a%b):a;
    //不用考虑大小的原因是因为在第一次可以进行颠倒
}
int GCD2(int a,int b)
{
    if(b==0)
        return a;
    return GCD2(b,a%b);
}