May the force be with you!
posts - 52,  comments - 33,  trackbacks - 0

下午比赛做得有点挫。被安排写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 阅读(277) 评论(0)  编辑 收藏 引用 所属分类: Problem Solving

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


你是第 free hit counter 位访客




<2008年1月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(4)

随笔分类(54)

随笔档案(52)

文章档案(1)

ACM/ICPC

技术综合

最新随笔

搜索

  •  

积分与排名

  • 积分 - 62043
  • 排名 - 356

最新评论

阅读排行榜

评论排行榜