Manchester


私信TA

用户名:wenyajie

访问量:310668

签 名:

在历史前进的逻辑中前进,这个逻辑就是人心向背的逻辑

等  级
排  名 1
经  验 62388
参赛次数 1
文章发表 188
年  龄 0
在职情况 学生
学  校 Xiamen University
专  业 计算机科学

  自我简介:

在历史前进的逻辑中前进,这个逻辑就是人心向背的逻辑

解题思路:
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);


参考代码:

#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;
}

别忘点赞哦-.-!

 

0.0分

16 人评分

  评论区