• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Mryan2005
不是天生非凡,而是敢于非凡
博客园    首页    新随笔    联系   管理    订阅  订阅
循环应用

求最大公约数

基本原理

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

本文来自博客园,作者:Mryan2005,转载请注明原文链接:https://www.cnblogs.com/Mryan2005/p/17872793.html

posted on 2023-11-20 07:45  Mryan2005  阅读(20)  评论(0)    收藏  举报  来源
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3