void cnt_cif(int n, int k, int &c)
{
if (n != 0)
{
if (n % 10 > k)
cnt_cif(n / 10, k, c + 1);
}
}
int main()
{
int n, k, c=0;
cin >> n >> k;
cnt_cif(n, k, c);
cout << c;
return 0;
}
错误
Severity Code Description Project File Line Suppression State
Error C2664 'void cnt_cif(int,int,int &)': cannot convert argument 3 from 'int' to 'int &'
Severity Code Description Project File Line Suppression State
Error (active) E0461 initial value of reference to non-const must be an lvalue
问题似乎在第11行
答案 0 :(得分:2)
要使用c
作为输出参数,您需要在函数中重新分配它。然后,您可以在进行递归调用时传递更新的变量。
#include <iostream>
using namespace std;
void cnt_cif(int n, int k, int &c)
{
if (n != 0)
{
if (n % 10 > k) {
c++;
cnt_cif(n / 10, k, c);
}
}
}
int main()
{
int n, k, c=0;
cin >> n >> k;
cnt_cif(n, k, c);
cout << c << '\n';
return 0;
}
答案 1 :(得分:1)
像c+1
这样的r值无法初始化像c
这样的l值引用。预增量运算符++
返回引用,因此您可以使用它来代替{{ 1}}。是否修复使得能够完成你想要的功能是另一个问题。
c+1
答案 2 :(得分:0)
我很抱歉含糊不清的细节。我终于弄明白了
void cnt_cif(int n, int k, int &c)
{
if (n != 0)
{
if (n % 10 > k)
cnt_cif(n / 10, k, ++c);
else
cnt_cif(n / 10, k, c);
}
}
int main()
{
int n, k, c=0;
cin >> n >> k;
cnt_cif(n, k, c);
cout << c;
return 0;
}
答案 3 :(得分:-1)
也许这就是你的意思? 已编辑以整理@Default
突出显示的逻辑int cnt_cif(int n, int k)
{
int c;
if (n != 0) {
c = (n % 10 > k) ? 1 : 0;
return cnt_cif(n / 10, k) + c;
}
return 0;
}
int main()
{
int n, k;
cin >> n >> k;
cout << cnt_cif(n, k);
return 0;
}
编辑2
对于它的价值,如果有人感兴趣,上面的内容已被修改为保持尾递归。此外,它已经过修改,以确保正确处理n
的负值。
int cnt_cif(int n, int k)
{
int m = n < 0 ? -n : n;
int c = (m != 0 && m % 10 > k) ? 1 : 0;
return (m == 0) ? 0 : c + cnt_cif(m / 10, k);
}
int main()
{
int n, k;
cin >> n >> k;
cout << cnt_cif(n, k);
return 0;
}
答案 4 :(得分:-2)
所以你试图将c
传递给函数,该函数以递归方式调用自身,然后在递归结束后打印c
。您的方法似乎是将c
传递给每次调用以将结果存储在其中。你的问题,也导致错误,你的函数void cnt_cif(int n, int k, int &c)
的签名将一个指向int的指针作为它的第三个参数,但在main中你给它一个int值。
int n, k, c=0;
cnt_cif(n, k, c);
你需要做的是给它指向值
的指针cnt_cif(n, k, &c);
还在你的函数中更改c
的值然后再次使用指针作为参数
if (n != 0){
if (n % 10 > k){
c += 1;
cnt_cif(n / 10, k, &c);
}
}
一个函数将一个值作为复制的参数,对函数内部值的任何更改都不会影响初始值。如果使用指针作为参数,指针将被复制,但它指向的值完全相同,并且更改为将影响原始指针。