循环应用

求最大公约数

基本原理

举个例子吧
例如:我们要算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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mryan2005

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值