This commit is contained in:
许大仙 2024-08-06 13:54:12 +08:00
parent cab9aff435
commit 11a8dcfcae

View File

@ -932,6 +932,98 @@ int main() {
}
```
### 5.3.5 应用示例
* 需求:给出一个整数 n ,判断该整数是否是 2 的幂次方。如果是,就输出 yes ;否则,输出 no 。
> [!NOTE]
>
> 思路:
>
> * ① 2^ 0 = 1 2^1 = 2 2^2 = 42^3 = 82^4 = 162^5 = 32 ...,规律:每一个数字都是前一个数字的 2 倍(任意一个数字,不断的除以 2 ,最终看结果是否是数字 1 )。
> * ② 循环终止条件:
> * 结果是 1 的时候,就可以结束,输出 yes 。
> * 如果在除以 2 的时候,无法被 2 整数,也可以结束,输出 no ,如: 100 / 2 = 5050 / 2 = 25 。
* 示例:
```c
#include <stdio.h>
int main() {
// 禁用 stdout 缓冲区
setbuf(stdout, NULL);
int n = 0;
printf("请输入一个整数:");
scanf("%d", &n);
while (n > 1 && n % 2 == 0) {
n /= 2;
}
if (n == 1) {
printf("yes");
} else {
printf("no");
}
return 0;
}
```
### 5.3.6 应用示例
* 需求整数反转123 --> 321 。
> [!NOTE]
>
> 思路:从右边开始,依次获取每一位数字,再拼接起来。
* 示例:
```c
#include <stdio.h>
int main() {
// 禁用 stdout 缓冲区
setbuf(stdout, NULL);
int num = 0;
int original = 0;
int rev = 0;
printf("请输入一个整数:");
scanf("%d", &num);
original = num;
// 从右边开始,依次获取每个数字,然后拼接到 rev 中
/**
* 第 1 次123 % 10 = 3rev = 0 * 10 + 3 = 3
* 第 2 次12 % 10 = 2rev = 3 * 10 + 2 = 32
* 第 3 次1 % 10 = 1rev = 32 * 10 + 1 = 321
*/
// 循环结束的条件是 num == 0
while (num != 0) {
// 获取 num 右边的第一位数字
int temp = num % 10;
// 去掉最后一位数字
num /= 10;
// 将 temp 拼接到 rev 的后面
rev = rev * 10 + temp;
}
printf("%d 的反转是 %d\n", original, rev);
return 0;
}
```
## 5.4 do-while 循环
### 5.4.1 概述