输出任意数的各位

本文介绍了两种C语言方法来输出一个整数的各位数字。第一种方法通过倒序后再输出,但不适用于包含连续零的情况。第二种方法利用mask计算最高位基数,逐位输出,能正确处理任意数的各位。还提供了一道编程题目,要求输出正整数的位数和各位数字之和,给出了相应代码示例。

用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;
}

提交结果:
PTA提交结果
值得注意的是,本题规定N不超过不超过109,因此,count需要<=10而非<=9(mask即为109),因为109有10位,写成<=9无法通过测试点2.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

再多坚持一下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值