校内模拟赛 C语言 数位递增(一个正整数如果任何一个数...)

问题描述:

一个正整数如果任何一个数位不大于右边相邻的数位,则称为一个数位递增的数,例如1135是一个数位递增的数,而1024不是一个数位递增的数。给定正整数n,请问在整数1-n中有多少个数位递增的数?

输入格式:输入的第一行包含一个整数n
输出格式:输出一行包含一个整数,表示答案
样例输入:30
样例输出:26
评测用例规模与约定:
对于40%的评测用例,1<=n<=1000,
对于80%的评测用例,1<=n<=100000,
对于所有评测用例,1<=n<=1000000。

思路:按照不同位数分类,把测试数据按位数归入相应类进行判断,详情见代码注释

代码:

#include<stdio.h>

int main()
{
	long int n,i,count=0;//定义要输入的n,用来遍历的i,用来计数的count 
	long int a,b,c,d,e,f;// 根据n的评测范围,定义6个长整型变量 
	scanf("%ld",&n);
	//当时想到的就是把他以不同位数拆分,对每一部分进行分别求解 
	for(i=1;i<=n;i++)
	{
		if(i<10)//1到9肯定都符合,但不能因此省略,否侧测试数据小于9就出错了 
		{
			count++;
			continue;
		}
		if(i>=10&&i<100)//2位数 
		{
			a=i/10;//十位 
			b=i%10;//个位 
			if(a<=b)//判断递增 
			{
				count++;//如果满足,则总数加1 
				continue;//该数符合条件后则返回进行下一个数的判断 
			}
		}
		if(i>=100&&i<1000)//3位数,以下思路同上 
		{
			a=i/100;
			b=i/10%10;
			c=i%10;
			if(a<=b&&b<=c)
			{
				count++;
				continue;
			}
		}
		if(i>=1000&&i<10000)//4位数 
		{
			a=i/1000;
			b=i/100%10;
			c=i/10%10;
			d=i%10;
			if(a<=b&&b<=c&&c<=d)
			{
				count++;
				continue;
			}
		}
		if(i>=10000&&i<100000)//5位数 
		{
			a=i/10000;
			b=i/1000%10;
			c=i/100%10;
			d=i/10%10;
			e=i%10;
			if(a<=b&&b<=c&&c<=d&&d<=e)
			{
				count++;
				continue;
			}
		}
		if(i>=100000&&i<1000000)//6位数 
		{
			a=i/100000;
			b=i/10000%10;
			c=i/1000%10;
			d=i/100%10;
			e=i/10%10;
			f=i%10;
			if(a<=b&&b<=c&&c<=d&&d<=e)
			{
				count++;
				continue;
			}
		}
	}
	printf("%ld",count);//输出总数 
	return 0;	
}

测试:
在这里插入图片描述

写在末尾:这一题因为当时想到了这个思路,就顺着写下去了,也没多想,感觉他还是比较繁琐的,还望大家指点。

发布了6 篇原创文章 · 获赞 3 · 访问量 560

猜你喜欢

转载自blog.csdn.net/qq_45556278/article/details/104976266