下午比赛做得有点挫。被安排写G题的解题报告,这里顺便贴上来。
——littlekid
题目描述:
【Problem G - 数制转换】
Description
有一种数制的基数是三,权值可以取-1,0,1,并且分别用符号-.0.1 表示。这种数值的
101 便表示十进制的10,即1×32 + 0×31 +
1×30 = 10,又如这种数制的-0 表示十进制
的-3,即-1×31 + 0×30 = -3。标称要求把给定的有符号证书转换为新数制的数,该数的
前面不能有多余的0,入10 的新数制表示是101,则不要输出乘0101。
输入格式
数据第一行的数字T 表示输入数据有T
组,接下来的T 行每行有一个整数N(32 位整型
可表示范围内),整数内不会有其他分隔符。
输出格式
对输入的每一个数字输出一行,该行是输入行整数的新数制表示。
Sample Input
2
10
-3
Sample Output
101
-0
【题目分析】
对于每一位,他有一个权值,为这一位乘以3^(i-1)。本题关键点就在于要从后面的位开
始取。如果能想到这里题目就搞定了——实现起来比较简单,还有一点就是负数问题,很快
就能想到每位取反。
【解题思路】
这个题目解法很简单:首先是正数的情况,对N进行取余,如果得1则这一位为1,为0自然
为0,如果取模得2,则进行转换,当前位取-1。对于负数,转化为相反数处理,然后每位取
反,相反数得相反数就是这个数本身。
【样例程序】
1 /*********************************************************************
2 Author: littlekid
3 Created Time: 2008-1-20 15:28:47
4 Problem Source:
5 Description:
6 ********************************************************************/
7 # include<stdio.h>
8
9 int main()
10 {
11 int t; scanf("%d", &t);
12 int tmp, k, cur, n;
13 int a[20], tag;
14
15 while (t --)
16 {
17 scanf("%d", &n);
18 tmp = n;
19 k = 0;
20 if (n == 0) ////这里开始未考虑到,WA了一次 !!!!!
21 {
22 printf("0\n");
23 continue;
24 }
25
26 tag = 1;
27 if (n < 0) //标记负数
28 {
29 n *= -1;
30 tag = -1;
31 }
32 //主要过程:对n不断除3并求余数
33 while ( n != 0 )
34 {
35 tmp = n%3;
36 if (tmp == 2)
37 {
38 tmp = -1;
39 n += 2;
40 }
41 else
42 {
43 n -= tmp;
44 }
45 a[k] = tmp*tag;
46 n /= 3;
47 k ++;
48 }
49 //输出结果
50 for (int i = k-1; i >= 0; i --)
51 {
52 switch(a[i])
53 {
54 case 0:printf("0");
55 break;
56 case -1:printf("-");
57 break;
58 case 1:printf("1");
59 break;
60 default:printf("ERROR\n");
61 }
62 }
63 printf("\n");
64 }
65 return 0;
66 }
67
posted on 2008-01-20 19:58
R2 阅读(289)
评论(0) 编辑 收藏 引用 所属分类:
Problem Solving