通过递归计算整数中的位数

时间:2014-02-06 17:40:18

标签: c++

我的代码如下:

/计算整数中的位数

#include <iostream>
using namespace std;

int countNum(int n,int d){
    if(n==0)
    return d;
    else
    return (n/10,d++);
}
int main(){
    int n;
    int d;
    cout<<"Enter number"<<endl;
    cin>>n;
   int x=countNum();
    cout<<x;
    return 0;
}

我无法弄清楚错误,它说 :函数`int countNum(int,int)'的参数太少 什么是问题?

8 个答案:

答案 0 :(得分:6)

因为你声明函数有两个参数:

int countNum(int n,int d){

你没有通过:

int x = countNum();

你可能打算这样称呼它,而不是:

int x = countNum(n, d);

还有:

return (n/10,d++);

应该是这样的:

return countNum(n/10,d++);

此外,您尚未初始化nd变量:

int n;
int d;

最后你根本不需要d参数。这是一个更好的版本:

int countNum(int n){
    return (n >= 10)
        ? 1 + countNum(n/10)
        : 1;
}

here是工作示例。

答案 1 :(得分:2)

int x=countNum();调用函数应该将实际参数传递给调用函数。您已经定义了函数countNum(int, int),这意味着它将从调用函数接收两个int作为参数,因此调用者应该传递它们在您的情况下丢失的那些。这就是错误太少的原因。

答案 2 :(得分:0)

您的代码在这里:

int x=countNum();

需要使用两个整数调用countNum。例如

int x=countNum(n, d);

答案 3 :(得分:0)

因为您尚未将参数传递给countNum函数。像int x=countNum(n,d);

一样使用它

答案 4 :(得分:0)

将其更改为:

int x=countNum(n,0);

您无需传递d,只需将0作为种子传递。

同时将countNum更改为:

int countNum(int n,int d){
    if(n==0)
    return d;
    else
    return coutNum(n/10,d+1); // NOTE: This is the recursive bit!
}

答案 5 :(得分:0)

#include <iostream>
using namespace std;

int countNum(int n,int d){
    if(n<10)
        return d;
    else
        return countNum(n/10, d+1);
}
int main(){
    int n;
    cout<<"Enter number"<<endl;
    cin>>n;
    int x=countNum(n, 1);
    cout<<x;
    return 0;
}

答案 6 :(得分:0)

假设这不适用于作业,有更好的方法可以做到这一点(仅举几个例子):

转换为字符串

unsigned int count_digits(unsigned int n)
{
    std::string sValue = std::to_string(n);
    return sValue.length();
}

<强>循环

unsigned int count_digits(unsigned int n)
{
    unsigned int cnt = 1;
    if (n > 0)
    {
        for (n = n/10; n > 0; n /= 10, ++cnt);
    }
    return cnt;
}

尾部递归

unsigned int count_digits(unsigned int n, unsigned int cnt = 1)
{
    if (n < 10)
        return cnt;
    else
        return count_digits(n / 10, cnt + 1);
}

注意:打开尾端递归优化后,编译器会将此转换为循环 - 防止不必要的调用堆栈溢出。

答案 7 :(得分:-2)

您的功能写错了。例如,不清楚为什么它有两个参数或者它本身以递归方式调用。

我会按照以下方式编写

int countNum( int n )
{
   return 1 + ( ( n /= 10 ) ? countNum( n ) : 0 );
}

甚至将它定义为

会更好
constexpr int countNum( int n )
{
   return 1 + ( ( n / 10 ) ? countNum( n/10 ) : 0 );
}