随笔 - 31  文章 - 0  评论 - 0  阅读 - 3251

循环应用

求最大公约数

基本原理

举个例子吧
例如:我们要算1218的公约数。
其实,只要先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

posted on   Mryan2005  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示