平衡三进制Ⅱ——Roj_1018

前提
平衡三进制Ⅱ就是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;
}
上一篇:LeetCode刷题之1018. 可被 5 整除的二进制前缀


下一篇:1018 锤子剪刀布 (20 分)