查找截断到小数位数的十进制值

时间:2016-08-27 11:51:04

标签: c algorithm runtime-error

给定一个整数k,预计会找到小数103993/33102的值,截断到k小数位。所以我的方法如下:

    int k ;
    scanf("%d",&k);
    printf("3");
    if(k>0)
    printf(".");
    long long int num=30;
    long long int numer = 1039930;
    long long int denom = 33102;
    while(k--)
    {
        long long int bro = numer/denom;
        printf("%lld",bro-num);
        num=bro;
        num*=10;
        numer*=10;
    }

但如果k20,则会显示一个奇怪的答案......循环中出现任何问题?
http://ideone.com/dndib2

2 个答案:

答案 0 :(得分:5)

如上所述,long long int溢出。这通过简单的长手划分显示了类似的方式,你甚至不需要long long int来计算它,更不用说尝试用魔术数字“修复”它。

#include <stdio.h>

int main (void) {
    int places = 20;
    int numer = 103993;
    int denom = 33102;
    int quot;
    int i;

    // integral part
    quot = numer / denom;
    printf("%d.", quot);
    numer -= denom * quot;

    // fractional part
    for(i=0; i<places; i++) {
        numer *= 10;
        quot = numer / denom;
        printf("%d", quot);
        numer -= denom * quot;
    }
    printf("\n");
    return 0;
}

节目输出:

3.14159265301190260407

编辑:小数位数的唯一限制是循环控制变量大小。如果需要,相同的代码将打印巨大的小数位数。

答案 1 :(得分:1)

你的问题是溢出的。

在循环中使用num *= 10;numer *= 10;,循环20次表示10 ^ 20(10到20的幂),long long int为64位,它可以保持最大值18,446,744,073,709,551,615(2 ^ 64-1),小于10 ^ 20。