在数学中,所谓“纯位数”是指由相同位元重复而组成的自然数。比如在十进制中,1,22,333,555 都是纯位数。 很显然,15 在十进制中不是一个纯位数,但是在二进制 15(10) = 1111(2) 却是一个纯位数。
一个显然的事实是,对于正整数 N,其在 N+1 进制中必然是一个一位数,也就必然是个纯位数。
对于一个正整数 N,试找出使其成为纯位数的最小进制 K。
一个正整数 N (0 < N < 10^8)
使 N 为纯位数的最小进制 K
22
15
10
2
嗐 在小米OJ上分,有一点特别恶心,那就是数据都没有给定的范围。说下这题踩的坑吧我刚开始以为这题是2~16进制的转换,后来发现有个测试点是45322,预期输出是36,再比如测试点输入876569,预期输出是876548。还有一个坑就是测试点输入1。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
string DecToX(ll n,ll x) //将10进制的n转换成x进制的字符串
{
string ans = "";
do{
ll t = n%x;
n /= x;
ans += (t>=0&&t<=9) ? t+'0' : t-10+'a';
}while(n);
reverse(ans.begin(),ans.end());
return ans;
}
bool isPure(string s) //判断是不是纯位数
{
map<char,int> m;
for(int i = 0; i < s.length(); i++)
{
m[s[i]]++;
}
return m.size()==1;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
//有个测试用例没过:输入: "876569",期望输出: "876568"
ll n;
while(cin >> n)
{
for(ll i = 2; i <= n; i++)
{
if(isPure(DecToX(n,i)))
{
cout << i << endl;
break;
}
}
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
bool isPure(int n,int x) //判断x进制的n是不是纯位数
{
int t = n%x;
while(n%x==t)
{
n /= x;
}
return n==0;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int n;
while(cin >> n)
{
for(int i = 2; i <= n+1; i++) //若写成i<=n,n=1时会有bug无输出
{
if(isPure(n,i))
{
cout << i << endl;
break;
}
}
}
return 0;
}