引言:介绍顺序输出和逆序输出的概念及其在编程中的应用场景.
在解决这个问题之前,我们可以先解决如何输出一个数的位数,得到了位数之后,我们便可以以位数为依托找出后续的各种关系,从而解决问题.
我们把问题简化为如下问题:
输入一个整数(可以是正数,负数或者0),要求 : (1) 求出它是几位数; (2) 分别输出每一位数字.例如123,输出1 2 3; (3) 按逆序输出各位数字,例如原数为 321, 应输出 1 2 3。
求位数代码:
int n;
printf("请输入一个整数:\n");
scanf("%d", &n);
int m;
m = n;
//输出位数
if(m==0)
{
t = 1;
}
else
{
while (m != 0)
{
t++;
m /= 10;
}
}
printf("%d是%d位数:\n",n,t);
我们先从键盘获取一个数字,由数学知识可知求位数与10关联,我们把获得的n不断除以十,同时定义一个变量t来保存位数.思路如下图:
注意一点细节:上面另外定义了一个m变量,是因为下面printf输出时需要原来的n,我没有动n的值,而是把n的值赋给m,让m的值去发生变化.
接下来我们来处理顺序输出问题
顺序输出代码示例:
//顺序输出
int w=1;
temp = abs(n);
for (int i = 1;i < t;i++)
{
w *= 10;
}
printf("顺序输出每一位数字:\n");
if (n < 0)
{
printf("-");
}
while (w > 0)
{
printf("%d ", temp / w);
temp = temp % w;
w /= 10;
}
printf("\n");
因为涉及到负数,顺序输出每一位时我们可以把n值取绝对值,用到abs函数,赋值给temp变量.
t 是 n 的位数,比如 n = 123,t = 3。
• w从 1 开始,每次乘 10,最终等于 10^(t-1)。
• 例如:
• n = 123,t = 3,最终 w = 100(10^(3-1))。
• n = 5678,t = 4,最终 w = 1000(10^(4-1))。
while循环代码解析如下图:
首先temp/w得首位并输出,如12345/10000可得1,w为10000.
第二步:temp %= w 去掉最高位,剩下后面的数字,如12345%10=2345.
第三步:w /= 10,让 w变成 10 的更小次幂,继续提取下一位,w为1000.然后接下来用2345进行接下来的操作.
注意细节:由于负数首位输出应该为负数,我们可以判断当n<0时,先输出一个负号,这个问题便解决了.
逆序输出代码示例:
printf("逆序输出每一位数字:\n");
temp = abs(n);
if (temp == 0)
{
printf("0 ");
}
while (temp > 0)
{
printf("%d ", temp %10);
temp /= 10;
}
printf("\n");
return 0;
}
代码解析:逆序输出的思路比较简单,temp%10获取最低位并打印,temp/=10去掉最低位,继续循环.
注意细节:处理0的特殊情况.
思路如下图:
运行结果截图:
总结:
1. 功能概述
本程序实现了以下功能:
• 计算用户输入整数的位数(包括正数、负数和 0)。
• 按顺序输出整数的每一位数字。
• 按逆序输出整数的每一位数字。
2. 代码实现思路
(1) 计算整数的位数
• 使用 while 循环对 m = abs(n) 进行除 10 运算,每次循环 t++ 直到 m 变为 0,即可统计出 n 的位数 t。
• 如果 n == 0,特判 t = 1,因为 0 只有一位。
(2) 顺序输出每一位数字
• 先计算出 w = 10^(t-1),即 w 为整数 n 的最高位对应的除数。
• 通过 temp / w 依次获取最高位数字,并更新 temp %= w 去掉已经输出的部分,w /= 10 逐步降低位数,直到 w == 0。
(3) 逆序输出每一位数字
• 直接利用 temp % 10 获取个位数字,并 temp /= 10 逐步去掉已输出部分,直到 temp == 0。