目录
一、问题描述
问题:
给一个不多于5位的正整数,要求:
①求出它是几位数;
②分别输出每一位数字;
③按逆序输出各位数字
实例:
123是一个3位数,百位、十位、个位分别为1,2,3;逆序输出为321;
输入:
123
输出:
3
1 2 3
321
二、问题求解
问题分析:
(1)求正整数的位数
方法一:对正整数进行整除10操作,每次整除都能整数就少1一位,则计数加一,直到整除为0;
例如:123/10=12 计数count=1;12/10=1 计数count=2;1/10=0 计数count=3,商为0,结束,整数123为一个3位数。
程序设计:
//求正整数的位数
int figure(int num) {
int count = 0;
if (num == 0) {
count = 1;
}
else {
while (num) {
num /= 10;
count++;
}
}
return count;
}
方法二:利用函数log10(x)+1
log()函数介绍:
头文件:<math.h>
函数原型: double log(double x);
功 能: 求以自然数为底数的对数
参 数: double x 为真数,必须大于0
返回值: 返回以自然数为底数的对数
公 式:loge x = b
注 意: 自然数e为常数2.71828
当将底数换为10就可以进行位数求解。我们知道log10(10)=1,闭区间【1-9】即为1位整数;log10(100)=2,闭区间【10-99】即为2位整数,所以求解整数位数为log10(x)+1;
int figure2(int num) {
if (num == 0) {
return 1;
}
else {
return ((int)log10(num)) + 1;//由于log函数返回类型是double,所以使用(int)进行强制转换
}
}
(2)求整数的各位上的数
整数对10求余(%10)即可得到整数最后一位上的数,例如:123%10=3;
而整数整除10(/10)就可消去整数最后一位,例如:123/10=12(因为整数/整数,结果仍为整数,相当于对结果进行了取整操作)
//求整数各位的数字
/*
返回类型为:整型数组指针(返回的是存放各位数字的数组起始地址)
num为待处理数字,数组a为存储数组
*/
int* figure_num(int num,int a[5]) {
int i = 0;
while(num){
a[i] = num % 10;
num /= 10;
i++;
}
return a;
}
int main() {
int num = 123;
int len = figure2(num);//计算整数位数
int arr[5];
int* p = arr;
p = figure_num(num,arr);//返回存储地址
for (int i = len-1; i >=0; i--) {
printf("%d ", arr[i]);//由高位向低位依次输出
}
}
(3)逆序输出
比较简单,直接循环输出的时候,按0~len-1依次输出即可。
举一反三:若要求输出一个整数的逆序整数该如何操作呢?
//逆序数
int reverse_num(int num) {
int res = 0;
while (num) {
res = res * 10 + num % 10;
num /= 10;
}
return res;
}