目录
前言:
一.求最小公倍数
1.1公式法
1.2遍历法
1.3乘除法
二.倒置字符串
前言:
今日份题目有:求两个整数的最小公倍数,求倒置字符串,。
一.求最小公倍数
牛客网链接: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数组里。
训言:
保证理解的前提下,保证质量的前提下,多刷题,最后总结!!!!