每日练题---C语言

目录

前言:

一.求最小公倍数

1.1公式法

1.2遍历法

1.3乘除法

二.倒置字符串


前言:

  今日份题目有求两个整数的最小公倍数,求倒置字符串,

一.求最小公倍数

  牛客网链接:OJ链接

  百度词条每日练题---C语言_第1张图片

每日练题---C语言_第2张图片

  例如:15能被1、3、5、15这些数整除,所以15这些整数的倍数。公倍数是两个整数或更多整数公有的倍数,求最小的那一个就是最小公倍数[a,b]表示a和b的最小公倍数没有最大公倍数,因为它可以无限大

1.1公式法

  公式:最大公约数 * 最小公倍数 = a * b

每日练题---C语言_第3张图片

1.2遍历法

  遍历法:最小公倍数至少也要大于等于两数的较大值。例如:4和6的最小公倍数是12;1和7的最小公倍数是7;

每日练题---C语言_第4张图片

  这种算法逻辑上可行的,但算法本身太差了,在OJ这种有时间限制的平台上是不能完全通过测验用例的

做OJ题需要考虑时间效率;代码只有经过多组多样的测试无误后,才能算正确;

1.3乘除法

  乘法:两个数的最小公倍数一定能被两个数整除,并且得到的商是另一个整数。例如:5和7的最小公倍数是35。35被5整除商7,35被7整除商5。那么a * i / b == 0,就意味着a*i是a和b的最小公倍数。

每日练题---C语言_第5张图片

二.倒置字符串

  牛客网链接:OJ链接

每日练题---C语言_第6张图片

  解题思路:逆序整个字符串,再把每个单词逆序。 

每日练题---C语言_第7张图片

#include 
#include 
void reverse(char* left, char* right)
{
    while (left < right)
    {
        char tmp = *left;
        *left = *right;
        *right = tmp;
        left++;
        right--;
    }
}
int main()
{
    //包括斜杠0,开辟大小为101个字符的数组
    char arr[101] = { 0 };
    //1.只读到\n才停止
    scanf("%[^\n]s", arr);
    int len = strlen(arr);
    reverse(arr, arr + len - 1);
    //逆序单词
    char* cur = arr;
    char* start = arr;
    while (*cur)
    {
        //找单词
        while (*cur != ' ' && *cur != '\0')
        {
            cur++;
        }
        reverse(start, cur - 1);
        start = cur + 1;
        if (*cur == ' ')
            cur++;
    }
    printf("%s", arr);
    return 0;
}

  读取包括空格的字符串,单纯使用scanf是完成不了的,因为空白是scanf结束读取的一个标志。这里的使用的方式是[^\n],它的意思是,让scanf读取到'\n'才停止读取

  读取带有空格的字符串到数组中的方式有:

  • scanf("%[^\n]s", arr);
  • gets(arr);
  • fgets(arr, 100, stdin);
  • while(arr[i++] = getchar() != '\n');

  gets在编译器看来是不安全的,因为没有限制读取的个数,可以使用的地方就使用,不可以就用fgets,这个函数限制了读取字符的个数100,从标准输入流stdin里读取到arr数组里

  训言:

  保证理解的前提下,保证质量的前提下,多刷题,最后总结!!!!

你可能感兴趣的:(每日练题,刷题)