前提
平衡三进制Ⅱ就是1016的反过来计算,本来可能想转换的方法可能是这道题目的难点,但是题目直接给出了转换的方法,所以这道题的难点就转移到了如何用代码实现它所提供的方法(没有数学上的难度的
要点
1.最主要的问题:一开始只是跟着题目走,然后就下意识以为第三步的每个数都要减一。用给的第一组数据8 1 测试出来的是002(内心:???)好的,显然是第一个应该是1,再考虑第二步加的是11,第三步也应该减去11
2.其他的都是一些比较小的(比如大于等于3忘了加等号),感觉是脑子不太清楚才会犯或者是漏了某些情况,在中途输出数据后可以马上改正
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int b[100]={0},c[100]={0};
int m=1,n=1;
void change3(int a,int fz,int fm)
{
int m=1,n=1; //cout<<"a="<<a<<endl;
while(a/3!=0||a%3!=0)
{
b[m]=a%3; //cout<<b[m]<<" ";
a/=3;
m++;
} //cout<<endl;
while(fz)
{
fm/=3;
if(fz>=fm)
{
c[n]=fz/fm; //cout<<c[n]<<" ";
fz=fz-c[n]*fm;
}
else c[n]=0;
n++;
}
for(int i=n-1;i>=1;i--)
{
c[i]++;
if(c[i]>=3&&i!=1)
{
c[i]-=3;
c[i-1]++;
}
if(c[i]>=3&&i==1)
{
b[1]++;
c[i]-=3;
} //cout<<"i="<<i<<" "<<c[i]<<endl;
}
if(m>1)
{
for(int i=1;i<m;i++)
{
b[i]++;
if(b[i]>=3&&i!=m-1)
{
b[i]-=3;
b[i+1]++;
}
if(b[i]>=3&&i==m-1)
{
b[i]-=3;
cout<<"1";
} //cout<<b[i];
}
for(int i=m-1;i>=1;i--)
{
b[i]--;
if(b[i]<0) b[i]=2;
cout<<b[i];
}
}
else cout<<b[1];
if(n>1)
{
cout<<".";
for(int i=1;i<n;i++)
{
c[i]--;
if(c[i]<0) c[i]=2;
cout<<c[i];
}
}
}
int main()
{
int fz,fm,a;
cin>>fz>>fm;
if(fz/fm)
{
a=fz/fm;
fz=fz-a*fm;
}
else a=0; //cout<<"a="<<a<<endl;
change3(a,fz,fm);
return 0;
}