问题描述:
一个正整数如果任何一个数位不大于右边相邻的数位,则称为一个数位递增的数,例如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;
}
测试:
写在末尾:这一题因为当时想到了这个思路,就顺着写下去了,也没多想,感觉他还是比较繁琐的,还望大家指点。