2499 不降的数字

题目描述:
小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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值