版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}