C ++程序的意外输出

高拉夫·贾恩(Gaurav Jain)

我正在解决http://codeforces.com/problemset/problem/552/B

在我的第一次尝试中,我想到了类似的东西:

#include <bits/stdc++.h>
using namespace std;
int digit(long a){
    int i=0;
    while(a){
        a/=10;
        i++;
    }
    return i;
}
int main()
{
    long n;
    long long s=0;
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin>>n;
    int dig=digit(n),i=0;
    while(i<dig){
        s+=(n-pow(10,i)+1);
        i++;
    }
    cout<<s;
    return 0;
}

但是为了输入

1000000

我的程序输出

5888895

我期待着

5888896

在第二次尝试中,我为自己编写了pow函数:

#include <bits/stdc++.h>
using namespace std;
int digit(long a){
    int i=0;
    while(a){
        a/=10;
        i++;
    }
    return i;
}
long long pow1(int a){
    long long s=1;
    while(a--){
        s*=10;
    }
    return s;
}
int main()
{
    long n;
    long long s=0;
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin>>n;
    int dig=digit(n),i=0;
    while(i<dig){
        long long aux=pow1(i);
        s+=(n-aux+1);
        i++;
    }
    cout<<s;


    return 0;
}

这次是正确的,如何解释其背后的工作原理?

迈克尔·凯彻

内置pow功能的问题在于,它的功能无法像您的功能那样精确。pow将x计算为y exp(y*log(x))该通用公式适用于所有(甚至是非整数)指数,并且其性能(主要)与参数无关。该公式的问题是,pow(10,2)可能是99.9,当将其转换为整数类型时,它会被截断为99。尝试pow(10,i) + 0.5执行适当的舍入。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章