我的代码如下:
/计算整数中的位数
#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)'的参数太少 什么是问题?
答案 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++);
此外,您尚未初始化n
和d
变量:
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 );
}