标签:Roj 进制 int fz ++ 1018 -- fm cout
前提
平衡三进制Ⅱ就是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;
}
标签:Roj,进制,int,fz,++,1018,--,fm,cout 来源: https://blog.csdn.net/Rachelhello123/article/details/115355138
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。