题目描述:
小b有一个非负整数N,她想请你找出 ≤N 的最大整数x,满足x各个位数上的数字是不降的。也就是说,设x的十进制表示为 a1,a2,…,am,则对于任意 1≤i<m,ai≤ai+1。
输入
输入一个非负整数N。
0≤N≤10^9
输出
输出一个整数,表示答案
输入样例
332
输出样例
299
解题思路:
1.首先我们分析一下数据,发现还比较小;(但是,你们放心,两层循环,不取巧的话,也会TLE)
2.连续不降,指的是从高位到低位不降,也就是满足高位上的数<=低位上的数;
3.我们就将循环写成从N开始,一直循环到0!!!(如果从0开始循环到N,拜拜嘞 ——不好意思,童鞋,呵呵,超时了)
4.我们每个<=N的数进行拆分 ,如果最低位>=最高位,就证明此时此刻满足而已,我们还要继续进行循环,循环到每一位都满足最低位>=最高位,此时弄一个特判(就是我上一篇博文说的打标记),如果退出循环后,这个依然满足最低位>=最高位,那么我就让特判 = 0,否则,就 = 1,最后一旦找到不降的数字,那么直接输出即可,将从N~0的循环break掉,因为我的循环是从N ~0开始找的,所以的话,我找到的肯定是最大的,就不需要再进行打擂台,什么比较大小呀,这样还节省点时间
核心代码:
#include<bits/stdc++.h>
using namespace std;
long long n,x,tot,f,lz = - 1;
bool phy(int y)
{
int k = y;
tot = k % 10;
k /= 10;
f = 0;
while(k != 0)
{
if(tot > k % 10 || tot == k % 10)
{
tot = k % 10;
k /= 10;
f = 0;
}
else
{
f = 1;
break;
}
}
if(f == 1)
return false;
else
return true;
}
int main()
{
scanf("%d",&n);
for(int i = n;i >= 0;i--)
{
if(phy(i) == true)
{
cout << i;
break;
}
}
return 0;
}