利用C语言求一个十进制数的位数,并且将它的每一位数字正序,倒序输出;

  1. 统计一个数的位数,从键盘获取一个正整数,利用代码获取它的位数

 在Visual Studio 2022中创建一个新项目,来进行代码书写和编译运行

#define _CRT_SECURE_NO_WARNINGS//用于scanf的正常使用
#include<stdio.h>
#include<math.h>
int main()
{
	long long data;
	printf("请输入要进行统计的数:");
	scanf("%lld", &data);
	int sum = 0;
	while (data != 0)
	{
		data /= 10;  //消除个位的运算方法,消除一次,统计一次
		sum++;
        printf("data=%lld    sum=%d\n",data,sum);
	}
	printf("%lld是个%d位数", data,sum);
	return 0;
}

 在上述代码中,我们运用到了消除个位的运算方法,在代码中也添加了相应的解释语法,运行结果中可以直观的看出运算过程。

例如:

整型变量 12345中,我们消除它的个位一次,即对它进行除以10的除法运算,统计的位数 sum 就+1。

以此类推,当最后一位统计完成后,我们从键盘输入的数,也就是代码中的data,就变成了0,而我们在while循环中的循环条件是data!=0,所以当最后一位统计完成后,data变成0,也就意味着循环的终止;

   2.正序,倒序输出一个整数的每一位数字

要求:-123456输出- 1 2 3 4 5 6 ;1234567输出1 2 3 4 5 6 7 ;(负号只输出一次)

对于上述这个问题,如果我们学习了数组,会让这个问题变得更容易操作,如果没有学习数组,那也没有关系,我们也有相应的解决办法:

首先,我们用数组来解决这个问题:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int main()
{
	long long data;
	int arr[50], i, tmp;
	printf("请输入要进行输出的整数:");
	scanf("%lld", &data);
	char symbol = ' ';//若为正数。直接输出空格
	if (data < 0)
	{
		symbol = '-';//symbol表示符号,若为负数,将空格变为‘-’
		data *= -1;//若data为负数,利用变量将负号保存起来,并且将data变为正数
	}

	for (i = 0; data != 0; i++)//第一个for循环
	{
		arr[i] = data % 10;//取余后保存在数组内
		data /= 10;//消除各位,为下一次
	}
	tmp = i;//用于保存数组长度
	printf("\n正序输出为:\n %c", symbol);

    //tmp-1即i-1,因为在第一个for循环中i在判断时多加了一次,可借鉴for循环规则
	for (i = tmp - 1; i >= 0; i--) 
	{
		printf("%2d", arr[i]);
	}
	printf("\n倒序输出为:\n %c", symbol);
	for (i = 0; i < tmp; i++)
	{
		printf("%2d", arr[i]);
	}
	return 0;
}

 在用数组进行对取余数的保存时,如下:  以13456为例

array[0]6
array[1]5
array[2]4
array[3]3
array[4]1

所以在后续进行正序,倒序输出时,要注意该问题。

不用数组,进行倒序,正序输出

  • 倒序

仍然运用取余操作

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int main()
{
	int data;
	scanf("%d", &data);
	if (data < 0)
	{
		printf("-");//若为负数,直接输出负号
		data *= -1;
	}
	while (data != 0)
	{
		printf("%3d", data % 10);
		data /= 10;
	}
	return 0;
}
  • 正序
#define _CRT_SECURE_NO_WARNINGS//用于scanf的正常使用
#include<stdio.h>
#include<math.h>
int main()
{
    long long n;
    scanf("%lld",&n);
    if (n == 0)
    {
        printf("0\n");
        return 0;
    }
    int count = 0;//位数
    long long m = n;
    while (n != 0)
    {
        n /= 10;//丢弃个位
        count++;
    }
    int power = pow(10,count-1);
    n = m;
    if (n < 0)
    {
        printf("-");
        n = -n;
    }
    while (n != 0)
    {
        printf("%d ",n/power);//获取高位
        n %= power;//消除高位
        power /= 10;//为对下一个高位进行操作做铺垫
    }
    return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值