#include <iostream>
#include <math.h>
using namespace std;
long long gcd(long long a,long long b){
if(b==0) return a;
else return gcd(b,a%b);
}
int main() {
long long a,b;
cin>>a>>b;
long long integer=a/b;
long long fenzi=a-integer*b; //a<b
fenzi/=gcd(fenzi,b);
b/=gcd(fenzi,b);
int flag=(fenzi!=0)?1:0; //分子不等于0,flag=1
int k=0;
while (pow(3,k)!=b) k++;
string xiaoshu,zhengshu;
while(fenzi!=0){
xiaoshu=to_string(fenzi%3)+xiaoshu;
fenzi/=3;
}
while(integer!=0){
zhengshu=to_string(integer%3)+zhengshu;
integer/=3;
}
double three=(flag==1)?stod(zhengshu)+stod(xiaoshu)*pow(10,-k):stod(zhengshu); //是否是小数
string str_3=to_string(three);
int carry=0,len=str_3.length();
for(int i=len-1;i>=0;--i){ //double末尾去0
if(str_3[i]=='0') continue;
else if(str_3[i]=='.') {
str_3=str_3.substr(0,i); //把.之前的i个字符串赋值
break;
}
else {
str_3=str_3.substr(0,i+1); //str_3[i]是非0数字,把它和它之间的字符串复制
break;
}
}
len=str_3.length();
for(int i=len-1;i>=0;--i){ //和全一相加
if(str_3[i]=='.') continue;
int num=carry+str_3[i]-'0'+1;
carry=0;
if(num>2) {
str_3[i]=num-3+'0';
carry=num/3;
}else{
str_3[i]=num+'0';
}
}
if(carry!=0)str_3=to_string(carry+1)+str_3; //最后有进位+1,有进位,则相加的头部也要和全1相加
len=str_3.length();
for(int i=len-1;i>=0;--i){ //独立相减
if(str_3[i]=='.') continue;
int num=str_3[i]-'0'-1;
if(num<0) str_3[i]='2';
else str_3[i]=num+'0';
}
cout<<str_3<<endl;
system("pause");
return 0;
}
平衡三进制 II
于 2022-03-02 12:31:47 首次发布