题解
因为x的数据范围特别大,所以这题不能用枚举做
思考一下,题目给定的大数的定义是每一位的范围为
x由两个相同的大数相加而成,所以x的范围为: ps:5+5=0,9+9=8(进1位)
x的个位数因为不能被进位,只能向前进位,因此个位数的范围为
x的第1位数绝对会被进位,因为两个最小的大数位数相加为:(进1位)
因此我们可以得出结论:
x的首位数范围:
x的中间位数的范围: 都被进了1位
x的个位数的范围:
代码实现思想
我们可以先把x的个位数加上1,然后我们判断x的每一位是否可以被10整除,如果可以,那么说明x就是非法的
因为此时x的首位范围:
x的中间位数范围:
x的个位数范围:
x的每一位数的范围是不存在可以被10整除的条件的.
接着我们再判断x的首位是否为1,如果是1,并且之前x的每一位也没有被10整除,那么说明x是合法的.
我们通过这行代码实现在x的个位数上+1:
x=x-x%10+(x%10+1)%10;
例如:
code
#include<bits/stdc++.h>
#define int long long
using namespace std;
void solve()
{
int x;cin>>x;
x=x-x%10+(x%10+1)%10;
while(x>9)
{
if(x%10==0)
{
cout<<"NO"<<endl;
return;
}
x/=10;
}
if(x==1)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
signed main()
{
int t;cin>>t;
while(t--)
{
solve();
}
return 0;
}