C++ 在C+;中使用pow()时出错+;
我试图解决一个函数问题,在这个问题中,我必须计算数字1在所有小于n(给定)的非负整数中出现的次数 这是我的密码:C++ 在C+;中使用pow()时出错+;,c++,pow,C++,Pow,我试图解决一个函数问题,在这个问题中,我必须计算数字1在所有小于n(给定)的非负整数中出现的次数 这是我的密码: int ones(int n, int d) { int rounddown = n - n % pow(10, d+1); int roundup = rounddown + pow(10, d+1); int right = n % pow(10, d); int dig = (n/pow(10, d)) % 10; if(dig<1
int ones(int n, int d)
{
int rounddown = n - n % pow(10, d+1);
int roundup = rounddown + pow(10, d+1);
int right = n % pow(10, d);
int dig = (n/pow(10, d)) % 10;
if(dig<1)
return rounddown/10;
else if(dig==1)
return rounddown/10 + right + 1;
else
return roundup/10;
}
int countDigitOne(int n) {
int count = 0;
string s = to_string(n);
for(int i=0;i<s.length();i++)
count+=ones(n, i);
return count;
}
int-one(int-n,int-d)
{
整数舍入=n-n%功率(10,d+1);
int-roundup=rounddown+pow(10,d+1);
int right=n%功率(10,d);
int dig=(n/pow(10,d))%10;
if(dig主要问题是类型转换。的结果是double
。模运算符不适用于double
。您需要采取以下措施
按如下方式修复第3行:
int rounddown = (int)(n - fmod(n, pow(10, d +1));
因为您的值都在integer
域中,所以您还可以使用:
int rounddown = n - n % (int)(pow(10, d + 1));
正如其他人所建议的那样
只是为了完整性……如果您没有被迫使用算术方法,您可以比较:
#include<iostream>
#include<string>
using namespace std;
int countOnesInNumber(string s)
{
int res = 0;
for(int i = 0; i < s.length(); i++)
{
if(s[i] == '1')
{
res++;
}
}
return res;
}
long countOnes(int upper)
{
long result = 0;
for(int i = 0; i < upper; i++)
{
result += countOnesInNumber(std::to_string(i));
}
return result;
}
int main()
{
string in;
cout << "Please enter a number:";
cin >> in;
cout << endl;
cout << "you choose:" << in << endl;
int n = stoi(in);
cout << "there are " << countOnes(n) << " ones under " << n << endl;
cin.ignore();
cin.get();
}
其中,n
必须是10的数量级(例如,10、100、1000、10000…)。如果你擅长数学,你甚至可能会找到一个完整的闭合公式。主要问题是类型转换。结果是double
。模运算符对double
不起作用。你需要使用
按如下方式修复第3行:
int rounddown = (int)(n - fmod(n, pow(10, d +1));
因为您的值都在integer
域中,所以您还可以使用:
int rounddown = n - n % (int)(pow(10, d + 1));
正如其他人所建议的那样
只是为了完整性……如果您没有被迫使用算术方法,您可以比较:
#include<iostream>
#include<string>
using namespace std;
int countOnesInNumber(string s)
{
int res = 0;
for(int i = 0; i < s.length(); i++)
{
if(s[i] == '1')
{
res++;
}
}
return res;
}
long countOnes(int upper)
{
long result = 0;
for(int i = 0; i < upper; i++)
{
result += countOnesInNumber(std::to_string(i));
}
return result;
}
int main()
{
string in;
cout << "Please enter a number:";
cin >> in;
cout << endl;
cout << "you choose:" << in << endl;
int n = stoi(in);
cout << "there are " << countOnes(n) << " ones under " << n << endl;
cin.ignore();
cin.get();
}
其中n
必须是10的量级(例如10、100、1000、10000…)。如果你擅长数学,你甚至可能会找到一个完整的闭合公式。该函数返回一个双精度。模运算是在整数之间进行的,因此出现错误-你试图在整数和双精度之间使用模。解决此问题的一种方法是使用强制转换:
int rounddown = n - n % (int)pow(10, d + 1);
正如其他人所说,对整数使用pow
函数以及从double
转换到int
效率低下,可能会导致错误。我建议(同意泰勒V的建议)您实现这个简单的递归整数pow:
int ipow(int a, int b){
if (b == 0)
return 1;
return a * ipow(a,b - 1);
}
这只适用于正整数a,b
,但我认为对于您的目的来说,这就足够了。现在您可以编写
int rounddown = n - n % ipow(10, d + 1);
该函数返回一个double。模运算在整数之间,因此出现错误-您试图在int和double之间使用模。解决此问题的一种方法是使用强制转换:
int rounddown = n - n % (int)pow(10, d + 1);
正如其他人所说,对整数使用pow
函数以及从double
转换到int
效率低下,可能会导致错误。我建议(同意泰勒V的建议)您实现这个简单的递归整数pow:
int ipow(int a, int b){
if (b == 0)
return 1;
return a * ipow(a,b - 1);
}
这只适用于正整数a,b
,但我认为对于您的目的来说,这就足够了。现在您可以编写
int rounddown = n - n % ipow(10, d + 1);
对于数字操作程序,考虑将数字作为字符串来处理。您可以将字符数字转换成数字:“代码>数字数字=字符数字-‘0’;< /代码>。它试图使用<代码> POW(double,double)< />代码,而不是我假定您想要的,即代码> POW(int,int)。
。关于如何添加您自己的powi(int,int)
除了所有关于类型问题的简单答案之外,在整数数学中使用pow
是一种痛苦的方法。您需要找到一些其他方法来实现这一点,而不必使用pow()
。故事结束。@SamVarshavchik完全正确。铸造(int)功率(x,y)
正如许多答案所暗示的,当返回的结果类似于8.9999999999999
时,你会得到8
,而不是9
。没有理由对整数问题进行浮点运算。@geedee感谢你接受我的答案。我还添加了一些可能帮助你找到其他答案的示例对于数字操作程序,考虑将数字作为字符串来处理。您可以通过以下方式将字符数字转换成数字:“代码>数字数字=字符数字-‘0’;< /代码>。它试图使用<代码> POW(double,double)< /> >而不是我假定您想要的,这是“代码> POW”。(int,int)。对于如何添加您自己的powi(int,int)
除了所有关于类型问题的简单给定答案之外,在整数数学中使用pow
是一种痛苦的方法。您需要找到一些其他方法,而不使用pow()
。故事结束。@SamVarshavchik完全正确。铸造(int)pow(x,y)
正如许多答案所暗示的,当返回的结果类似于8.9999999999999
时,你会得到8
,而不是9
。没有理由对整数问题进行浮点运算。@geedee感谢你接受我的答案。我还添加了一些可能帮助你找到其他答案的示例/您的问题的更高性能解决方案。递归解决方案中仍有一些小错误。我确信最后一行应该是a*ipow(a,b-1)
。此外,您的解决方案将运行到b<0
的无限循环中。如果(b<0)返回0,您应该添加另一个条件(因为这将导致数字0
,当转换为int时将0
。你是对的,它应该是a*ipow(a,b-1)
(修复了它)。至于b递归解决方案中仍然有一些小错误。我确信最后一行应该是a*ipow(a,b-1)
。此外,您的解决方案将运行到b<0
的无限循环中。如果(b<0)返回0,您应该添加另一个条件。
(因为这将导致数字0
,当转换为int时将0
。您是对的,它应该是a*ipow(a,b-1)
(已修复)。至于b