平衡三进制2
Smiling & Weeping
---- 道理都懂,只是情绪作祟,故事太撩人。
题目链接:https://www.matiji.net
题目:三进制计算机2
很好的思路:不似原本三进制0,1,2 而是-1,0,1 这本质上也是三进制,就是将所有原本的2进一,本位-1,就可以保持数值大小不变
注意:这道题卡输入、输出,不能使用cout , cin (cout << endl 也不行),想用的话解除同步(ios::sync_with_stdio(false))
Talk is cheap , show me the code
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n , num , nums[50]; 4 inline int read(){ 5 int num=0; 6 char c; 7 bool flag = false; 8 while((c=getchar()) == ' ' || c == '\n' || c == '\t'); 9 if(c == '-') 10 flag = true; 11 else 12 num = c-'0'; 13 while(isdigit(c=getchar())) 14 num = num*10 + c-'0'; 15 return (flag ? -1 : 1)*num; 16 } 17 int main() 18 { 19 scanf("%d",&n); 20 while(n--){ 21 bool flag = true; 22 int len = 0; 23 scanf("%d",&num); 24 if(num == 0){printf("0\n"); continue;} 25 if(num<0) num *= -1 , flag = false; 26 while(num){ 27 nums[++len] = num%3; 28 num /= 3; 29 } 30 for(int j = 1; j <= len; j++){ 31 //if(nums[j] >= 2) len = max(len , j+1); 32 if(nums[j] >= 3){ 33 //if(j == len) len++; 34 nums[j+1] += 1; 35 nums[j] %= 3; 36 } 37 if(nums[j] == 2){ 38 nums[j+1] += 1; 39 nums[j] = -1; 40 } 41 } 42 if(nums[len+1]) len++; 43 if(flag){ 44 for(int j = len; j >= 1; j--){ 45 if(nums[j] == -1) printf("-"); 46 else printf("%d",nums[j]); 47 nums[j] = 0; 48 } 49 printf("\n"); 50 } 51 else{ 52 for(int j = len; j >= 1; j--){ 53 if(nums[j] == 1) printf("-"); 54 else printf("%d",nums[j]*(-1)); 55 nums[j] = 0; 56 } 57 printf("\n"); 58 } 59 } 60 return 0; 61 }
万头攒动火树银花之处不必找我
文章到此结束,我们下次再见