poj-1702

来源:互联网 发布:旅行消费数据报告 编辑:程序博客网 时间:2024/05/16 12:04
//384K79MSG++#include <cstdio>#include <cstring>using namespace std;const int MAX = 22;long long weights[MAX];void init() {int res = 1;for (int i = 0; i < MAX; i++) {weights[i] = res;res *= 3;}}int leftPart[21];int rightPart[21];int leftPos;int rightPos;void solve(int val) {int carry = 0;// printf("r %d\n", 20%3);for (int i = 0; i < MAX - 1; i++) {// if (val > 0) {int curWeightDigit = val%3;curWeightDigit += carry;if (curWeightDigit == 1) { // right need a poise// printf("A %d %lld %d\n", i, weights[i+1], carry);rightPart[rightPos++] = weights[i];carry = 0;} else if (curWeightDigit == 2) {leftPart[leftPos++] = weights[i];// printf("B %d %lld %d\n", i, weights[i+1], carry);carry = 1;// } else if (curWeightDigit == 3) {// // carry = 1;// carry = 1;}val /= 3;// } else {// break;// }}if (leftPos == 0) {printf("empty ");} else {for (int i = 0; i < leftPos; i++) {if (i < leftPos - 1) {printf("%d,", leftPart[i]);} else {printf("%d ", leftPart[i]);}}}for (int i = 0; i < rightPos; i++) {if (i < rightPos - 1) {printf("%d,", rightPart[i]);} else {printf("%d\n", rightPart[i]);}}}int caseNum;int main() {init();scanf("%d", &caseNum);for (int i = 1; i <= caseNum; i++) {leftPos = 0;rightPos = 0;int val;scanf("%d", &val);solve(val);}}


进制转换题,3进制的。

思路就是将 转化完以后的3进制数里 数值为2 的位进行 加posie 使得最后的3进制数的数位数值只有1 和 0(因为每种posie只有一个,所以必须是0/1)

0 0
原创粉丝点击