一、最大公约数
思路1:(穷举法)
两个数的最大公约数一定是小于两个数中较小的一个数,最大公约数最小就是1。
int main()
{
int a = 0;
int b = 0;
scanf("%d %d",&a,&b);
int min = a < b ? a : b;
int i = 1;
int s = min;
for (i = 1;i <= min;i++)
{
if (a % i == 0 && b % i == 0)
{
s = i;
}
}
printf("%d\n", s);
return 0;
}
思路2:辗转相除法
两数取余数,如果为0;除数即为最大公约数,如果不为0,令被除数等于除数,除数变为余数,继续取余数,直到两数取余数为0;此时除数就是最大公约数。
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
while (a%b)
{
int tmp = a %b;
a = b;
b = tmp;
}
printf("%d\n", b);
return 0;
}
思路3:更项减损术(参考博客:http://t.csdn.cn/DlDcv,原文更精彩)
用较大数减去较小数,再不断用差减减数得到新的差(当差是负数时,就反过来减),不停循环直到减数和差相等为止,此时这个相等的数就是最大公约数。
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
while (a != b)
{
if (a > b)
{
a = a - b;
}
else
{
b = b - a;
}
}
printf("%d\n", a);
return 0;
}
二、最小公倍数
思路1:(穷举法)
两个数的最小公倍数最小就是较大数本身,随后递增进行试运算,直到找到一个数能够同时对两个数取余数得0为止。此数就是最小公倍数。
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int max = a > b ? a : b;
int i = 0;
//1
for (i = max;i <= a * b;i++)
{
if (i % a == 0 && i % b == 0)
{
printf("%d\n", i);
break;
}
}
//2
/*for (i = 1;i <= max;i++)
{
if ((a * i) % b == 0)
{
printf("%d\n", a*i);
break;
}
}
*/
return 0;
}
思路2:辗转相除法求a,b最大公约数m,再利用公式 a*b/m求最小公倍数
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int x = a;
int y = b;
while (a % b)
{
int tmp = a % b;
a = b;
b = tmp;
}
printf("%d\n", x * y / b);
return 0;
}
三、复杂情况的字符串逆序
输入 I like beijing.
输出 beijing. like I
此题并非简单的字符串逆序,而是将单词顺序逆序,单词本身并没有逆序。
通过分析我们发现
#include<assert.h>
void reverse(char* left, char* right)
{
assert(left && right);
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[101] = { 0 };
gets(arr);
int len = strlen(arr);
//1、整体逆序
reverse(arr, arr + len - 1);
//2、每个单词的逆序
char* s = arr;
char* e = s;
while (*s!='\0')
{
while (*e != ' ' && *e != '\0')
{
e++;
}
reverse(s, e-1);
s = e + 1;
if (*e == ' ')
{
e++;
}
}
printf("%s\n", arr);
return 0;
}
注意:
在获取字符串时,并没有使用scanf,使用的是gets函数,原因在于,scanf函数不会读取空格
比如,输入abc def,他只会接收adc
但是scanf并不是没有办法接受空格,如果使用可以如此写 scanf("%[^\n]",arr)