- 统计一个数的位数,从键盘获取一个正整数,利用代码获取它的位数
在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;
}