coderforces 1984B 题型:思维题

142 阅读1分钟

Problem - B - Codeforces

题解

因为x的数据范围特别大,所以这题不能用枚举做 image.png

思考一下,题目给定的大数的定义是每一位的范围为[5,9][5,9]

x由两个相同的大数相加而成,所以x的范围为: [0,8][0,8] ps:5+5=0,9+9=8(进1位)

x的个位数因为不能被进位,只能向前进位,因此个位数的范围为[0,8][0,8]

x的第1位数绝对会被进位,因为两个最小的大数位数相加为:5+5=05+5=0(进1位)

因此我们可以得出结论:

x的首位数范围:[1,1][1,1]

x的中间位数的范围:[1,9][1,9] 都被进了1位

x的个位数的范围:[0,8][0,8]

代码实现思想

我们可以先把x的个位数加上1,然后我们判断x的每一位是否可以被10整除,如果可以,那么说明x就是非法的

因为此时x的首位范围:[1,1][1,1]

x的中间位数范围:[1,9][1,9]

x的个位数范围:[1,9][1,9]

x的每一位数的范围是不存在可以被10整除的条件的.

接着我们再判断x的首位是否为1,如果是1,并且之前x的每一位也没有被10整除,那么说明x是合法的.

我们通过这行代码实现在x的个位数上+1:

	x=x-x%10+(x%10+1)%10;

例如:

image.png

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;
}

image.png