如果一个十进制正整数能够被它的每一个非零数码整除,则称它为幸运数字,比如 408 是一个幸运数字,因为 408 能被 4 与 8 整除,而 1023 不是,因为它不能被 2 整除。给定一个正整数 n,请判定它是否为幸运数字。
输入:
第一行包含整数 T,表示共有 T 组测试数据。
每组数据占一行,包含一个整数 n。
输出:
每组数据输出一行结果,如果 n 是一个幸运数字,输出 Yes;否则,输出 No。
范围:
对于 20% 的数据,1≤n≤10的9次方
对于 40% 的数据,1≤n≤10的18次方
对于 60% 的数据,1≤n≤10的500次方
对于 100% 的数据,1≤n≤10的1000次方
代码:
#include <bits/stdc++.h>
using namespace std;
bool b[10];
bool check(string n,int x)
{
long long a = 0;
for (int i = 0;i < n.size();i++)
{
a *= 10;
a += (n[i] - '0');
a %= x;
}
if (a == 0) return true;
return false;
}
int main()
{
int T;
cin >> T;
for (int l = 1;l <= T;l++)
{
string n;
cin >> n;
memset(b,false,sizeof b);
for (int i = 0;i < n.size();i++)
{
int x = n[i] - '0';
if (x <= 1 || b[x]) continue;
if (!check(n,x))
{
cout << "No" << endl;
n = "0";
break;
}
else
{
b[x] = true;
}
}
if (n != "0") cout << "Yes" << endl;
}
return 0;
}
算法好处:
1、枚举过一个数就不用再次枚举此数了
2、因为没有数据类型可以承受n,所以用string类型,且此算法可用string类型
3、check()当中a最大不会超过100,可用int类型
4、check当中可以满足题意,求出能否整除x,且时间复杂度小