C语言关于统计数字位数,并顺序和逆序输出

1.给定一个整数可能为正,0,负数,统计这个数据的位数.例如1234567输出7; -12345678输出8;0
输出1
采用丢弃个位的方法
代码如下
int main()
{
	long long n;
	scanf("%lld", &n);
	int count = 0;//统计位数 
	do\\do while至少可以实现一次循环,当为0时可输出位数为一+
	{
		count++;
		n /= 10;
	} while (n != 0);
	printf("%d\n", count);
	return 0;
}

2.给定一个整数可能为正,0,负数,逆序输出这个数据的每一位.
逆序输出
需要获取输入数字的个位,后丢弃个位,重复该动作然后丢弃“新个位”,直至完成输出。
这里我们分别用到 %, / 进行实现;
例如 1234567 输出 7 6 5 4 3 2 1
例如 -12345678 输出 -8 7 6 5 4 3 2 1

 代码如下:

int main()
{
    long long n;
    scanf("%lld", &n);
    if (n < 0)\\为负数时因逆序输出数字,所以将负号单独提出,并取正数
    {
        printf("-");
        n = -n;
    }
    if (n == 0)
    {
        printf("0\n");
        return 0;
    }
    while (n != 0)\\循环也可用do while 循环
    {
        printf("%d ", n % 10);//得到个位数字
        n /= 10;//丢弃个位数字
    }

    return 0;
}

逆序输出其他方法

运用指针,因对指针掌握并不熟练,不做过多解释,代码注释中含有部分解释


int main()
{
    int num,*p,total=0;
    scanf("%d",&num);
    *p=1;//初始指针为1,若输入“0”,即为一位
    num=abs(num);//取绝对值
    while(num){
      *p=num%10;//逆序将每一位数字赋给指针
      num=num/10;
      if(num){
         *p++;//指针移向下一位,当num==0时不向下移动,不加if判断,最后会将指针*p移向一个空的地址,存储数据未知
      }
      total++;
    }
    if(num==0){
        total=1;
    }
    printf("total=%d\n",total);
    for(int i=0;i<total;i++){
      printf("%d",*p);//从后向前逐个输出
      *p--;
    }
    return 0;
}

3.给定一个整数可能为正,0,负数,顺序输出这个数字的每一位

从逆序输出中可以得出我们要获取每位数字后丢弃该位数字;因此我们想用什么方法能获取最高位,并丢弃最高位。

这里一个n位数获取最高位可以除10的(n-1)次方,丢弃该位时可以对其取10的(n-1)次方的余数。

我们这里用pow函数来获取除数,解释如下图:

int main()
{
	long long n;
	scanf("%lld", &n);
	if (n == 0)
	{
		printf("0\n");
		return 0;
	}
	else if (n < 0)
	{
		printf("-");
		n = -n;
	}

	int count = 0;//统计位数
	long long m = n;
	while (m != 0)//得到m的位数
	{
		count++;
		m /= 10;//丢弃个位
	}
	int power = pow(10, count - 1);//如果n==123456,power=100000
	while (n != 0)
	{
		printf("%d,", n / power);//输出最高位
		n %= power;//丢弃最高位
		power /= 10;
	}
	return 0;
}

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值