我正在解决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] 删除。
我来说两句