You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Beecrowd平台上百分比计算的小数点后数值错误

C语言百分比计算小数精度错误问题解决

问题描述

将以下C语言代码提交至Beecrowd平台后,生成的小数点后数值出现错误。期望得到如「Percentual de coelhos: 32.62 %」这类保留两位小数的百分比结果,已尝试将float改为double,但问题仍未解决。

原代码

#include <stdio.h>

double pct_cobaias(int x, int y);

int main() {
    
    int contador, cobaia;
    char tipo;
    int soma_cobaia, soma_coelho, soma_rato, soma_sapo;
    double pct_coelho, pct_rato, pct_sapo;

    scanf("%d", &contador);

    soma_cobaia = 0;
    soma_coelho = 0;
    soma_rato = 0;
    soma_sapo =  0;

    while (contador > 0)
    {
        scanf("%d %c", &cobaia, &tipo);

        if (cobaia >= 1 && cobaia <= 15)
        {
            if (tipo == 'C' || tipo == 'R' || tipo == 'S')
            {
                soma_cobaia += cobaia;

                if (tipo == 'C')
                {
                    soma_coelho += cobaia;
                }

                if (tipo == 'R')
                {
                    soma_rato += cobaia;
                }

                if (tipo == 'S')
                {
                    soma_sapo += cobaia;
                }
            }
        }

        contador--;
    }

    pct_coelho = pct_cobaias(soma_coelho, soma_cobaia);
    pct_rato = pct_cobaias(soma_rato, soma_cobaia);
    pct_sapo = pct_cobaias(soma_sapo, soma_cobaia);

    printf("Total: %d cobaias\n", soma_cobaia);

    printf("Total de coelhos: %d\n", soma_coelho);
    printf("Total de ratos: %d\n", soma_rato);
    printf("Total de sapos: %d\n", soma_sapo);

    printf("Percental de coelhos: %.2lf %\n", pct_coelho);
    printf("Percental de ratos: %.2lf %\n", pct_rato);
    printf("Percental de sapos: %.2lf %\n", pct_sapo);

    return 0;
}

double pct_cobaias(int x, int y) {

    double pct;

    pct = (x * 100) / y;

    return pct;
}

错误原因分析

  • 整数除法丢失精度:pct_cobaias函数中,x和y都是int类型,x*100的结果也是int,执行/y时会触发整数除法——直接截断小数部分,再转成double类型,导致小数精度完全丢失。比如3262/100会得到32,而非32.62。
  • printf格式符错误:输出百分比符号时,直接写%会被解析为格式控制符的开头,无法正确输出单个%,会导致输出格式混乱。

修正方案

修改点1:将整数除法改为浮点除法

把计算式中的任意一个操作数转为double类型,强制触发浮点运算:

pct = (double)x * 100 / y;

或者:

pct = (x * 100.0) / y;

修改点2:修正printf的百分比符号输出

将输出语句中的%改为%%,才能正确输出单个百分比符号:

printf("Percental de coelhos: %.2lf %%", pct_coelho);

修正后的完整代码

#include <stdio.h>

double pct_cobaias(int x, int y);

int main() {
    
    int contador, cobaia;
    char tipo;
    int soma_cobaia, soma_coelho, soma_rato, soma_sapo;
    double pct_coelho, pct_rato, pct_sapo;

    scanf("%d", &contador);

    soma_cobaia = 0;
    soma_coelho = 0;
    soma_rato = 0;
    soma_sapo =  0;

    while (contador > 0)
    {
        scanf("%d %c", &cobaia, &tipo);

        if (cobaia >= 1 && cobaia <= 15)
        {
            if (tipo == 'C' || tipo == 'R' || tipo == 'S')
            {
                soma_cobaia += cobaia;

                if (tipo == 'C')
                {
                    soma_coelho += cobaia;
                }

                if (tipo == 'R')
                {
                    soma_rato += cobaia;
                }

                if (tipo == 'S')
                {
                    soma_sapo += cobaia;
                }
            }
        }

        contador--;
    }

    pct_coelho = pct_cobaias(soma_coelho, soma_cobaia);
    pct_rato = pct_cobaias(soma_rato, soma_cobaia);
    pct_sapo = pct_cobaias(soma_sapo, soma_cobaia);

    printf("Total: %d cobaias\n", soma_cobaia);

    printf("Total de coelhos: %d\n", soma_coelho);
    printf("Total de ratos: %d\n", soma_rato);
    printf("Total de sapos: %d\n", soma_sapo);

    printf("Percental de coelhos: %.2lf %%\n", pct_coelho);
    printf("Percental de ratos: %.2lf %%\n", pct_rato);
    printf("Percental de sapos: %.2lf %%\n", pct_sapo);

    return 0;
}

double pct_cobaias(int x, int y) {

    double pct;

    pct = (double)x * 100 / y;

    return pct;
}

内容的提问来源于stack exchange,提问作者Henrique Bispo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 11:58:12