引言
常常有将一个正整数各位数字倒序排列或是统计各数字数目的题目,难点就在于如何分离出正整数中的每一位数字,本次以C语言为模板尝试一下。
思路一——递归法
步骤:
1 获得该正整数的第一位数字或最后一位数字(考虑到分离出首位数字后接下来的可能为零,因此选择首先分离末位数字)
2 对分离出一位数字的剩下数字组成的正整数重复上步操作。
#include<stdio.h>
void getNum(int n)
{
int s=0;
if(n>0)
s=n%10; //分离末位数字
printf("%d ",s);
getNum(n/10); //对剩下数字递归
}
int main()
{
int n;
scanf("%d",&n);
getNum(n);
return 0;
}
输入:123456789
结果为:
9 8 7 6 5 4 3 2 1
思路二——迭代法
步骤大体与递归相同:
#include<stdio.h>
#include<math.h>
void getNum(int n)
{
int s;
int len=(int)log10(n)+1; //获得n的位数
for(int i=0;i<len;i++)
{
s=n%10;
printf("%d ",s);
n=n/10;
}
}
int main()
{
int n;
scanf("%d",&n);
getNum(n);
return 0;
}
输入:135792468
结果为:
8 6 4 2 9 7 5 3 1
while循环形式:
int j=0;
while(n>0)
{
j++;
n/=10;
} //j即为正整数n的位数
应用(PTA基础练习题)
——本题要求实现一个函数,可统计任一整数中某个位数出现的次数。例如-21252中,2出现了3次,则该函数应该返回3。
函数接口定义:
int Count_Digit ( const int N, const int D );
其中N和D都是用户传入的参数。N的值不超过int的范围;D是[0, 9]区间内的个位数。函数须返回N中D出现的次数。
裁判测试程序样例:
#include <stdio.h>
int Count_Digit ( const int N, const int D );
int main()
{
int N, D;
scanf("%d %d", &N, &D);
printf("%d\n", Count_Digit(N, D));
return 0;
}
解答:
int Count_Digit ( const int N, const int D )
{
int s[100];
int x=N; //用于获取N的位数
int M; //对N取绝对值
int p=0,q=1; //p用以储存N的位数,q!=0作为获取位数for循环判断条件
int m=0; //m储存N中出现D的数目
for(;q!=0;p++)
{
q=x/10;
x/=10;
}
if(N<0)
M=-N;
else
M=N;
for(int i=0;i<p;i++)
{
s[i]=M%10;
M=M/10;
}
for(int j=0;j<p;j++)
{
if(s[j]==D)
m++;
}
return m;
}
(注:上述代码块中m需进行初始化,否则无法得到正确结果。而C语言int类型默认值为零,所以为何会出现这种区别呢?)