你的任务呢,是将一个有理数转换成三进制小数。“什么是三进制小数呢?”你一定会问,这很明白,就是以三为基(二进制数以2为基,而十进制数则以10为基)的小数。
输入
有理数的值都是在0与1之间的,每个有理数都由一个分子和一个分母表示,分子与分母之间隔着一个斜杠。有理数的个数不会超过1000个。
输出
输出格式见样本输出,它是以小数点开头的具有10位精度的3进制数。
样例输入
1/3 1/4 1/6 7/8
样例输出
.1000000000 .0202020202 .0111111111 .2121212122
解题思路
1.输入分子x,分母y,求出x/y存入num;
2.根据小数部分进制转换思路:
(1):设转换进制为jinzhi=3进制;
(2):假设小数为1/4=0.25
①:0.25 * 3= 0.75 整数部分为0,小数部分为0.75
②:0.75 * 3= 2.25 整数部分为2,小数部分为0.25
③:0.25 * 3= 0.75 整数部分为0,小数部分为0.75
④:0.75 * 3= 2.25 整数部分为2,小数部分为0.25
.............
(3):把整数部分写下来为0202......这就是0.25转换为三进制后,对应小数点后面的数;
(4):我们假设精度为小数点后面三位,则0.25---->0.021,比方10进制数,大于等于5的进位,这里3进制数,就是大于等于1.5的进位,很显然0.0202保留三位小数就是 0.021;
(5):题目要求保留小数点后面10位,所上面求整数部分过程要求11次;
(6):最后进位(满3进1),注意:如三进制小数0.22222,要求保留4为小数的话,不是简单的向前面一位进1就结束,(因为进1后为0.2223,三进制是不能有3的,故满三还得进1);
参考代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <stdio.h>
void output_three( double num );
int jinzhi = 3;//可换为其它进制
/*-----------------------------------------*/
int main()
{
int x, y;
double num;
while ( scanf( "%d/%d", &x, &y ) != EOF )
{
num = 1.0 * x / y;//乘1.0转化为浮点型
output_three( num );
}
return(0);
}
/*-----------------------------------------*/
void output_three( double num )
{
int A[11];
for ( int i = 0; i < 11; i++ )
{
num *= jinzhi;
A[i] = (int) num;
num -= A[i];
}
if ( A[10] >= 1.0 * jinzhi / 2 )//三进制的‘四舍五入’
A[9] += 1;
for ( int j = 9; j > 0; j-- )//进位,小数点后第一位为3时,不进到个位
{
if ( A[j] == 3 )
{
A[j - 1] += 1;
A[j] = 0;
}
}
printf( "." ); //输出结果
for ( int k = 0; k < 10; k++ )
printf( "%d", A[k] );
printf( "\n" );
return;
}
(本文为我站大神“ Manchester”创作)