文章目錄
- Input:
- Output:
- Sample Input:
- Sample Output:
Result |
TIME Limit |
MEMORY Limit |
Run Times |
AC Times |
JUDGE |
|
5s |
8192K |
307 |
138 |
Standard |
工匠大師Hill打造出一個精緻的天平, 對他的徒弟Oren說:“你幫我做一些砝碼配套,為了方便攜帶,砝碼數目要盡量少”。
Oren:“好。我將按照2進位的規則打造,也就是1,2,4,8,16等等,這樣在稱量同等重量下使用的砝碼數量最少,只使用7個砝碼就可以稱量1-127的重量。”
Hill:“No, you are wrong”。
Oren:“難道還有更好的方法?2進位是最優的,這一點是可以證明的”
Hill:“如果只允許砝碼放在天平的一端,那麼你說的是對的,可是並沒有人限制我們可以在天平的兩端放置砝碼。所以可以有更好的方法。如可以設計砝碼重量為1,3,9,27,81,只用5個砝碼就可以稱量1-121”。
Oren:“原來是3進位,那怎麼稱重呢? 如100克重量?”
Hill:“在天平的左端放上重物,再放上砝碼9,右端放砝碼1, 27, 81”。
Oren:“嗯,可這是怎麼算出來的呢?”
Hill:“It’s your business”。
現在,作為Oren的朋友,請你設計一個程式來計算在這種砝碼下應如何稱量。
Input:
輸入包括多個整數,每個數n佔據一行,代表要稱重的重量。0 < n <= 1000000000。
Output:
對於每個輸入的整數,計算當此重量放置在天平左端時,應如何安排3進位的砝碼,使天平平衡。每個結果輸出一行,輸出格式如例子所示,每個數字後面一個空格,如某一側沒有砝碼,則輸出0,多個砝碼按重量升序排列。
Sample Input:
10030
Sample Output:
9 left, 1 27 81 right.0 left, 3 27 right./*
3進位數,列幾個數不難發現與該數模3的餘數有關,餘2的話,砝碼加入左端,
並且給n+1後在繼續模3,餘1的時候加入右端,餘0的時候不操作;
*/
#include <cstdio>#include <iostream>using namespace std;int main (){ int n,c[20]; c[0]=1; for (int i=1; i<20 ; i++) { c[i]=c[i-1]*3; } while (scanf("%d",&n)!=EOF) { int a[20],l[20],r[20],k=0,ll=0,rr=0;//l存左端,r存右端 while (n) { int t=n%3; if(t==2) {n=(n+1)/3;l[ll++]=c[k];}//餘2時,砝碼加入左端,並且給n+1後在繼續模3 if(t==1) {n=n/3;r[rr++]=c[k];}//餘1的時候加入右端 if(t==0)n=n/3; k++; } if(!ll)printf("0 left, "); else { for (int i=0 ; i<ll ; i++) printf("%d ",l[i]); printf("left, "); } if(!rr)printf("0 right./n"); else { for (int i=0 ; i< rr ; i++) printf("%d ",r[i]); printf("right./n"); } } return 0;}