前言:
今日份题目有:求两个整数的最小公倍数,求倒置字符串,。
一.求最小公倍数
牛客网链接:OJ链接
百度词条:
例如:15能被1、3、5、15这些数整除,所以15这些整数的倍数。公倍数是两个整数或更多整数公有的倍数,求最小的那一个就是最小公倍数。[a,b]表示a和b的最小公倍数。没有最大公倍数,因为它可以无限大。
1.1公式法
公式:最大公约数 * 最小公倍数 = a * b
1.2遍历法
遍历法:最小公倍数至少也要大于等于两数的较大值。例如:4和6的最小公倍数是12;1和7的最小公倍数是7;
这种算法逻辑上可行的,但算法本身太差了,在OJ这种有时间限制的平台上是不能完全通过测验用例的。
做OJ题需要考虑时间效率;代码只有经过多组多样的测试无误后,才能算正确;
1.3乘除法
乘法:两个数的最小公倍数一定能被两个数整除,并且得到的商是另一个整数。例如:5和7的最小公倍数是35。35被5整除商7,35被7整除商5。那么a * i / b == 0,就意味着a*i是a和b的最小公倍数。
二.倒置字符串
牛客网链接:OJ链接
解题思路:逆序整个字符串,再把每个单词逆序。
#include <stdio.h> #include <string.h> 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数组里。
训言:
保证理解的前提下,保证质量的前提下,多刷题,最后总结!!!!