【小米OJ】纯位数

守給你的承諾、 提交于 2020-01-24 14:57:09

在数学中,所谓“纯位数”是指由相同位元重复而组成的自然数。比如在十进制中,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。

AC代码WA代码:

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

AC代码:

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

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!