平衡三进制 - 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博客