平衡三进制
平衡三进制 - OI Wiki
https://oi-wiki.org/math/balanced-ternary/
上海市计算机学会竞赛平台 | YACS
方法一,先分离后进位
#include <iostream>
using namespace std;
int n, a[100], cnt;
bool flag;
int main()
{cin >> n;if(n==0){cout << 0 << endl;return 0;}if(n<0){n=-n;flag=true;}while(n){cnt++;a[cnt]=n%3;n/=3;}for(int i=1; i<=cnt+1; ++i){if(a[i]==2){a[i]=-1;a[i+1]+=1;}else if(a[i]==3){a[i]=0;a[i+1]+=1;}}if(a[cnt+1]){cnt++;}if(flag){for(int i=cnt; i>=1; --i){if(a[i]==1){cout << "z";continue;}if(a[i]==-1){a[i]=1;}cout << a[i];}}else{for(int i=cnt; i>=1; --i){if(a[i]==-1){cout << "z";}else{cout << a[i];}}}return 0;
}
方法二,边分离边进位
#include <iostream>
using namespace std;
int n, a[100], cnt;
bool flag;
int main()
{cin >> n;if(n==0){cout << 0 << endl;return 0;}if(n<0){n=-n;flag=true;}while(n){cnt++;a[cnt]+=n%3;if(a[cnt]==2){a[cnt]=-1;a[cnt+1]+=1;}else if(a[cnt]==3){a[cnt]=0;a[cnt+1]+=1;}n/=3;}if(a[cnt+1]){cnt++;}if(flag){for(int i=cnt; i>=1; --i){if(a[i]==1){cout << "z";continue;}if(a[i]==-1){a[i]=1;}cout << a[i];}}else{for(int i=cnt; i>=1; --i){if(a[i]==-1){cout << "z";}else{cout << a[i];}}}return 0;
}
延伸题目:
Topcoder SRM 604 div1题解-CSDN博客