10进制转任意进制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38262266/article/details/87950755

题目描述

    N<k时,root(N,k) = N,否则,root(N,k) = root(N',k)。N'为N的k进制表示的各位数字之和。输入x,y,k,输出root(x^y,k)的值 (这里^为乘方,不是异或),2=<k<=16,0<x,y<2000000000,有一半的测试点里 x^y 会溢出int的范围(>=2000000000) 

输入描述:

    每组测试数据包括一行,x(0<x<2000000000), y(0<y<2000000000), k(2<=k<=16)

输出描述:

    输入可能有多组数据,对于每一组数据,root(x^y, k)的值

示例1

输入

4 4 10

 

输出

4

#include<bits/stdc++.h>
using namespace std;

/*函数:十进制转任意进制*/
string tenToR(long long n,long long r)
{
    //十进制n转r进制 ,返回字符串s
    char str[1000001];
    stack<int>s;
    while(n)
    {
        s.push(n%r);
        n = n/r;
    }
    int i = 0;
    while(!s.empty())
    {
        switch(s.top())
        {
        case 10:
            str[i++] = 'A';
            break;
        case 11:
            str[i++] = 'B';
            break;
        case 12:
            str[i++] = 'C';
            break;
        case 13:
            str[i++] = 'D';
            break;
        case 14:
            str[i++] = 'E';
            break;
        case 15:
            str[i++] = 'F';
            break;
        default:
            str[i++] = s.top()+'0';
        }
        s.pop();
    }
    string st = str;
    return st;
}

long long get(string s)
{
    long long value = 0;
    for(int i=0;i<s.length();i++)
    {
        //cout<<s[i]<<endl;
        if(s[i]-'0'>=0&&s[i]-'0'<=9)
        {
            value+=s[i]-'0';
        }
        if(s[i]=='A')
        {
            value+=10;
        }
        if(s[i]=='B')
        {
            value+=11;
        }
        if(s[i]=='C')
        {
            value+=12;
        }
        if(s[i]=='D')
        {
            value+=13;
        }
        if(s[i]=='E')
        {
            value+=14;
        }
        if(s[i]=='F')
        {
            value+=15;
        }
    }
    return value;
}

void root(long long x,long long k)
{
    if(x<k)
    {
        cout<<x<<endl;
    }
    else
    {
        long long p = get(tenToR(x,k));
        root(p,k);
    }
}

int main()
{
    long long x,y,k;
    while(true)
    {
        cin>>x>>y>>k;
        long long num=1;
        while(y--)
        {
            num*=x;
        }
        root(num,k);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38262266/article/details/87950755