下午比赛G题的解题报告

下午比赛G题的解题报告

下午比赛做得有点挫。被安排写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 

你可能感兴趣的:(下午比赛G题的解题报告)