检测到论坛CSS可能没有正确加载,如出现排版混乱请刷新重试。

We detected that the CSS might not be loaded correctly. If the website displays abnormally, Please refresh and try again.

  • 编程开发
  • 如何实现小数点后不固定位数的输出

这是编程参考书籍《算法竞赛入门经典》第二章的习题.

请注意第九题画横线的那一句. 在printf输出小数时使用的表达式"%.nlf"中, n是一个确定的常数. 而题目现在要求的精确度是一个不固定的变量. 我到现在都没有很好的思路...

目前的思路是手动输出, 即先用floor函数得到整数部分, 然后再逐位输出小数部分直到到达小数点后第c位
虽然我总觉得应该有更简单的办法

个人解答:

#include <stdio.h>
#include <math.h>

int main(void)
{
    double d, a, b;
    int c, i = 0, n, tmp;
    scanf("%lf %lf %d", &a, &b, &c);

    d = a / b;
    n = floor(d);
    printf("%d.", n);

    d -= n;
    while(i < c+1) {
        d *= 10;

        // 对于最后一位, 要处理四舍五入
        if(i != 0 && i < c) {
            n = tmp;
        } else if(i == c) {
            if(tmp >= 5) {
                n++;
            }
        }

        tmp = floor(d);
        if(i != 0) {
            printf("%d", n);
        }

        d -= tmp;
        i++;
    }

    return 0;
}
#include<stdio.h>
int a,b,c,ans[109];
int main(void){
    scanf("%d %d %d",&a,&b,&c);
    for(int i=0;i<=c+1;i++){
        if(a<b){
            ans[i]=0;
            a=a%b*10;
        }
        else{
            ans[i]=a/b;
            a=a%b*10;
        }
    }
    printf("%d",ans[0]);
    if(c>0){
        printf(".");
    }
    if(ans[c+1]>=5){
        ans[c]++;
    }
    for(int i=1;i<=c;i++){
        printf("%d",ans[i]);
    }
    printf("\n");
    return 0;
}

}

临时出来的思路,具体是通过循环整除+取余来求小数
说实话一点逻辑没有,循环变量的取值还是我猜的,结果样例过了(小声

gyigi 因为题目的位置是在一本算法入门参考书的第二章
所以没想这么多
这道题要较真的话得上高精度,挺麻烦的

这必然是个有理数
或许获得其循环节是一个更加通用的解法,适用于c>100

5 天 后

さらば限界少女 其实也不是新思路,字符串表示数字在银行里面处理极大的数据时用的很多,不过银行系统运算时基本上是整数部分很长,而不是小数部分。

7 个月 后

时隔很长时间的圆满结局的补全,虽然感觉已经迟了
翻看C++ Primer, 可以使用cout的precision函数来实现小数点后不确定位数的输出

代码如下:

std::cout.precision(c);
std::cout << a/b ;

如果仅限于C语言的话,也可以先用sprint来定制printf需要的格式字符串来解决问题

© 2025 wvbCommunity 管理团队

删封申诉 | 知乎专栏 | 状态监控 | 用户协议(EULA) | 隐私政策

本站文章除其作者特殊声明外,一律采用CC BY-NC-SA 4.0许可协议进行授权,进行转载或二次创作时务必以相同协议进行共享,严禁用于商业用途。