初学C语言,OJ题目的解题过程中经常需要提取一个数字的每一位并输出;分为如下两种情况:正序输出,逆序输出。

正序输出

按照传统思路,对于一个数,可以通过除法取整或者取余来实现对各位的提取。这里是我们学校OJ里的顺序输出题目:HautOJ 1601

注意整数运算避免使用double类型的函数如pow()。
本题可先用一个循环计算出最高位的位权h,然后再用一个循环,循环内容为: 输出最高位(n/h)、扔掉最高位(n = n%h)、降低最高位位权(h = h/10),直到位权h为0。

先贴代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
int main()
{
int n,m,p;
scanf("%d",&n);
m=n;
p=1;
while (m>9)
{
m=m/10;
p=p*10;
}

while (p>0)
{
printf("%d ",n/p);
n=n%p;
p=p/10;
}
return 0;
}

计算权位

注意我们这里P即为数字n的权位,当数字m不为个位数的话,就每次砍掉一位,并提升权位一位。
例如:我们有一个数字2333。

1:我们进行计算,2333/10=233,权位提升到10。

2:233/10=23,提升权位到100。

3:23/10=2,提升权位到1000,运行条件判断,结束循环。
在这里我们使用了循环来避免浮点型数字的出现。

输出各位数字

每次对该数字进行除法取整,每次计算结束后数值变更为砍掉最高位的数字,并对位权降位,如此循环可得结果。

逆序输出

相关题目可见HautOJ1060
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
while (n!=0)
{
printf("%d ",n%10);
n=n/10;
}
return 0;
}

每次循环进行的时候,对该数字除10取余,可得最低位。取整,砍掉最低位。单次取整结果作为下次取余的数字。如此循环,直至数字变为个位数(n!=0)。

回文数

(正序,逆序都会了,回文呢?

当然,回文数的判断只是把该数与其逆序数对比,相等即回文。单独放出判断函数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int huiwen (int i)
{
int t,p=0;
t=i;
while (i!=0)
{
p=i%10+p*10;
i=i/10;
}
if (p==t)
{
return 1;
}
else
{
return 0;
}

}

该函数里我们添加了一个变量t用于储存原始数据i,原因是因为我们在每次取整的时候会对数字i进行改动。