2014-02-06 145 views
0
计数的整数位数

我的代码如下:中位数的整数通过递归

#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)' 什么是问题?

+4

看看'countNum(int n,int d)'。然后看'countNum();'。现在回头看看'countNum(int n,int d)'。看到问题了吗? –

+0

这是作业吗?使用递归为此(而不是利用尾端递归),将泛滥的调用堆栈没有很好的理由... –

回答

2

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

+0

好的谢谢它的工作:) –

0

您的代码在这里:

int x=countNum(); 

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

int x=countNum(n, d); 
0

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

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; 
} 

and here的工作例子。

+0

谢谢我得到它 –

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! 
} 
+0

当我最后传递参数和我的代码编译没有错误,但当我运行我的代码,但输入数字后,按下输入,但按下后输入黑色输出屏幕消失为什么是这样?是我的代码罚款吗?或者我必须cout别的东西? –

+0

这是因为你的程序写入控制台然后退出。它退出时关闭控制台。您可以在'return'之前添加另一个读取来暂停程序,或者在'return'语句中放置一个断点,以便在程序退出前查看输出。 – Sean

+0

那是什么systempause?什么是实际的东西..感谢 –

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; 
} 
+0

你为什么不[运行](http://ideone.com/PtzCKU)它然后发布? – P0W

+0

它没有给出错误,但当我运行它并输入数字,但输入数字后,屏幕消失?为什么这样?也告诉我,在countNum(n,d)你已经传递了n和d个参数,并且在调用函数中你已经采用了一个参数0。 –

+0

对不起。固定和测试。 –

-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); 
} 
+4

Aaaaaand [segmentation fault](http://coliru.stacked-crooked.com/a/5fb​​4f9646bce4089)。 – Shoe

+0

我不怀疑你会这样写,所以严格来说,你的回答是没有错的。不幸的是,这是一种不正确的方式。 –

+0

@Jefffre我犯了一个错字。我点了我的帖子。 –

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); 
} 

注:由于车尾递归优化开启,你的编译器将其转化成你的循环 - 预防调用堆栈的不必要泛滥。

+0

这是我们的实验室活动只有通过递归..谢谢反正 –