用C语言实现输出任意数的各位的两种通用方法
第一种方法:倒序后再输出
本方法是先将数倒序,再通过第二个do…while代码块得到并输出各位。
请读者务必记住,原数对10取余(%)是得到它的最后一位数,而原数除以(/)是丢掉它的最后一位数,这两条原则是解法的关键。
读者也可以取消注释第一个do…while代码块后的输出语句查看每次循环数的变化。
#include <stdio.h>
int main(){
//假定输入无零整数
int x;
scanf("%d", &x);
int t = 0;
//实现倒序输出
do {
//d得到最后一位数
int d = x % 10;
t = t * 10 + d;
//x丢掉最后一位数
x /= 10;
} while ( x > 0 );
//printf("x=%d, t=%d\n", x, t);
x = t;
do {
int d= x % 10;
printf("%d", d);
if ( x > 10 ) {
printf(" ");
}
x /= 10;
} while ( x > 0);
printf("\n");
return 0;
}
此方法有些冗余,先倒序输出再输出依次倒过来的数,输出的数就是原数的各位。
但是此解法也无法输出诸如700这样的数,输出会直接变成7,这是因为在第一个do…while循环中,由于x类型是int,导致“x /= 10”直接等于0,循环直接结束,再通过第二个do…while循环中的"int d= x % 10"直接输出数d,再通过"x /= 10"得到0,循环也终止了,请读者仔细体会。
下文所述的方法可以输出这样的数,真正达到输出任意数的各位的目的。
第二种方法:利用mask
本解法使用mask先算出最高位的基数(比如输入12345,会得出mask为10000),再通过下面的do…while循环,依次通过降低mask的10倍,通过对10取余(%)是得到它的最后一位数,依次类推。(比如12345进入后,会先输出1,然后x变成2345,mask变成1000,再循环,输出2,这样以此类推…)。
#include <stdio.h>
int main(){
int x;
scanf("%d", &x);
int mask = 1;
int t = x;
//保证t(即原来的x)只剩最高位数,并得到mask
while ( t>9 ) {
//t丢掉最后一位数,mask代表最高位的基数
t /= 10;
mask *= 10;
}
//
do {
//得到第一位数,以后每次循环都会输出下一位数
int d = x / mask;
printf("%d", d);
//只要不是最后一位,每位输出后紧跟一个空格
if ( mask > 9 ) {
printf(" ");
}
//x逐渐后移一位,mask的也逐渐降10倍
x %= mask;
mask /= 10;
//printf(" x=%d, mask=%d, d=%d\n", x, mask, d);
} while ( mask > 0);
printf("\n");
return 0;
}
附上PTA一题:
对于给定的正整数N,求它的位数及其各位数字之和。
输入格式:
输入在一行中给出一个不超过109的正整数N。
输出格式:
在一行中输出N的位数及其各位数字之和,中间用一个空格隔开。
输入样例:
321
输出样例:
3 6
我的提交代码:
#include <stdio.h>
int main() {
int N, mask, t, count, d, sum;
scanf("%d", &N);
mask = 1; t = N; count = 1; sum=0;
while ( t > 9 ) {
t /= 10;
count ++;
mask *= 10;
}
if (count <= 10) {
do {
int d = N / mask;
sum += d;
N %= mask;
mask /= 10;
} while ( mask > 0);
}
printf("%d %d", count, sum);
return 0;
}
提交结果:

值得注意的是,本题规定N不超过不超过109,因此,count需要<=10而非<=9(mask即为109),因为109有10位,写成<=9无法通过测试点2.
本文介绍了两种C语言方法来输出一个整数的各位数字。第一种方法通过倒序后再输出,但不适用于包含连续零的情况。第二种方法利用mask计算最高位基数,逐位输出,能正确处理任意数的各位。还提供了一道编程题目,要求输出正整数的位数和各位数字之和,给出了相应代码示例。
1799

被折叠的 条评论
为什么被折叠?



