循环应用
求最大公约数
基本原理
举个例子吧
例如:我们要算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
分类:
计算机大全 / 我与C语言
标签:
c语言
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架