引言

常常有将一个正整数各位数字倒序排列或是统计各数字数目的题目,难点就在于如何分离出正整数中的每一位数字,本次以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类型默认值为零,所以为何会出现这种区别呢?)

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐