C++ 在C+;中使用pow()时出错+;

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

我试图解决一个函数问题,在这个问题中,我必须计算数字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)
        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