三进制 /*Eva's Balance Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3155 Accepted: 1567 Description Eva has a balance with 20 poises. The weights of the poises are 1, 3, 9, 27,...,3^19. Eva asserts that she has a way to measure any object whose weight is an integer from 1 to (3^20-1)/2. Assuming that Eva has placed an object with the weight in this range on the left tray of the balance, your task is to place the proper poises on the proper trays so as to weigh the object out. Input The first line is an integer T (1 <= T <= 20), which shows the number of the test cases. Each of the following T lines contains an integer W (1 <= W <= (3^20-1)/2), expressing the weight of an object. Output For each test case print a line, showing the weights of the poises on the left tray and the right tray. Use a space to separate the left tray and the right tray. The poises on the same tray are arranged in the increasing order, and a comma separates every two of them. If there is no poise on the tray, output "empty". Sample Input 3 9 5 20 Sample Output empty 9 1,3 9 1,9 3,27 Source POJ Monthly--2004.07.18*/ #include <stdio.h> #include "string.h" #define MAX_POISES_NUM 20 int gaiPoise[MAX_POISES_NUM]; int main(void) { int iLoop; int iWeight ; int iCaseNum; int aiPoise[MAX_POISES_NUM]; int iLeftNum; int aiLeftPoise[MAX_POISES_NUM]; int iRightNum; int aiRightPoise[MAX_POISES_NUM]; int iNum; int aiTernary[MAX_POISES_NUM+1]; aiPoise[0] = 1; for (iLoop = 1; iLoop < MAX_POISES_NUM; iLoop++) { aiPoise[iLoop] = aiPoise[iLoop-1]*3; } scanf("%d",&iCaseNum); while (iCaseNum--) { scanf("%d",&iWeight); iNum = 0; while(iWeight) { aiTernary[iNum] = iWeight%3; iWeight = iWeight/3; iNum++; } aiTernary[iNum] = 0; iLeftNum = 0; iRightNum = 0; for (iLoop = 0; iLoop <= iNum; iLoop++) { if (3 == aiTernary[iLoop]) { aiTernary[iLoop+1]++; } else if (2 == aiTernary[iLoop]) { aiLeftPoise[iLeftNum] = aiPoise[iLoop]; iLeftNum++; aiTernary[iLoop+1]++; } else if (1 == aiTernary[iLoop]) { aiRightPoise[iRightNum] = aiPoise[iLoop]; iRightNum++; } } if (0 == iLeftNum) { printf("empty"); } else { printf("%d",aiLeftPoise[0]); for (iLoop = 1 ;iLoop < iLeftNum; iLoop++) { printf(",%d",aiLeftPoise[iLoop]); } } printf(" %d",aiRightPoise[0]); for (iLoop = 1 ;iLoop < iRightNum; iLoop++) { printf(",%d",aiRightPoise[iLoop]); } printf("/n"); } return 0; }