diff --git a/docs/notes/01_c-basic/04_xdx/index.md b/docs/notes/01_c-basic/04_xdx/index.md index 533fb66..5c69854 100644 --- a/docs/notes/01_c-basic/04_xdx/index.md +++ b/docs/notes/01_c-basic/04_xdx/index.md @@ -932,6 +932,98 @@ int main() { } ``` +### 5.3.5 应用示例 + +* 需求:给出一个整数 n ,判断该整数是否是 2 的幂次方。如果是,就输出 yes ;否则,输出 no 。 + +> [!NOTE] +> +> 思路: +> +> * ① 2^ 0 = 1 ,2^1 = 2 ,2^2 = 4,2^3 = 8,2^4 = 16,2^5 = 32 ...,规律:每一个数字都是前一个数字的 2 倍(任意一个数字,不断的除以 2 ,最终看结果是否是数字 1 )。 +> * ② 循环终止条件: +> * 结果是 1 的时候,就可以结束,输出 yes 。 +> * 如果在除以 2 的时候,无法被 2 整数,也可以结束,输出 no ,如: 100 / 2 = 50,50 / 2 = 25 。 + + + +* 示例: + +```c +#include + +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 + +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 = 3,rev = 0 * 10 + 3 = 3 + * 第 2 次,12 % 10 = 2,rev = 3 * 10 + 2 = 32 + * 第 3 次,1 % 10 = 1,rev = 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 概述