求最大公约数
基本原理
举个例子吧
例如:我们要算12
和18
的公约数。
其实,只要先12%18
就可以得到一个余数,然后再拿这个余数%18
,然后得到一个余数,最后将这个余数除以12
,直至b = 0
如下所示
a b mod
12 18 12
18 12 6
12 6 0
6 0
代码实现
#include <stdio.h>
int main() {
int a,b,temp,temp2,temp3;
scanf("%d %d", &a, &b);
temp2 = a;
temp3 = b;
while(b != 0) {
temp = a % b;
a = b;
b = temp;
}
printf("%d和%d的公倍数是%d",temp2,temp3,a);
}
正序整数分解
基本原理
我们先将他倒过来,然后再通过循环除10来实现
代码实现
#include <stdio.h>
int main() {
int a,b,t=0;
scanf("%d",&a);
while ( a != 0) {
b = a % 10 ;
a /= 10;
t *= 10;
t += b;
}
while ( t != 0) {
b = t % 10 ;
t /= 10;
printf(" %d", b);
}
return 0;
}
但是,这太麻烦了,还有更简单的
看下面构想
假设有一个数为 123456
123456 / 100000 => 1
100000 / 10 => 10000
123456 % 100000 => 23456
23456 / 10000 => 2
10000 / 10 => 1000
23456 % 10000 => 3456
3456 / 1000 => 3
1000 / 10 => 100
3456 % 1000 => 456
456 / 100 => 4
100 / 10 => 10
456 % 100 => 56
56 / 10 => 5
10 / 10 => 1
56 % 10 => 6
6 / 1 => 6
1 / 1 = > 1
6 % 1 => 0
这个办法就是将最高位撇掉的算法。
但是,这只是解决了个十百千万……上都没有零,万一后面有多个0
呢?
例如:700000
那该怎么办?
其实可以这样做
该变while
的条件,使其为mask>0
时执行
因为mask
只要还大于0
,肯定就有执行的余地。
所以代码为
#include <stdio.h>
int main() {
int a = 100000, mask = 100000, d;
printf("a = %d mask = %d\n", a, mask);
do {
d = a / mask;
a %= mask;
mask /= 10;
printf("%d ", d);
} while (mask > 0);
}
但是,mask
是固定的,假如输入10000
,前面就会被自动补上0
。
对此我们要知道它是多少位的,然后对症下药。
#include <stdio.h>
int main() {
int a = 100000, mask = 1, d, e=0,temp = a;
printf("a = %d mask = %d\n", a, mask);
while(temp > 0){
temp /= 10;
e++;
}
for (int i = 1; i < e; i++) {
mask *= 10;
}
do {
d = a / mask;
a %= mask;
mask /= 10;
printf("%d ", d);
} while (mask > 0);
}
最终,结果就是1 0 0 0 0 0
当a
等于1
的时候呢,运算下来,还是1