Вот мой код для печати делителей, а затем количество делителей данного числа.
Теперь предположим, что я беру 2 тестовых случая: 5 и 8; этот код дает счет 5 как 2 и 8 как 6 (то есть он добавляет предыдущий счет).
Даже если я объявлю это как int count = 0;
он возвращает тот же результат.
Другая проблема возникает, когда я заявляю int count = 0
внутренняя функция factors
,
Код дает счет как 0 для всех случаев.
#include<iostream>
using namespace std;
int count;
long long factors(long n, long f=1)
{if(n%f==0) {
cout << f << endl;
count++;
}
if(f==n) {
return 0;
}
factors(n,f+1);
return count;
}
int main()
{
int n;
int t;
cin >> t;
while(t--)
{
cin >> n;
cout << factors(n) << endl;
}return 0;
}
Использование глобалов обычно не очень хорошая идея. Это особенно плохо в рекурсивных функциях, которые предпочтительно должны быть реентерабельными. Конечно, вы можете исправить свою функцию, сбросив счетчик в цикле, например так:
while(t--)
{
cin>>n;
count = 0; // Reset count before the recursive call
cout << factors(n) << endl;
}
Вы также можете сделать factors
«обертка», которая сбрасывает count
освободить абонентов от необходимости сброса count
перед звонком factors
, как это:
long long factors(long n) {
count = 0;
return factors(n, 1);
}
long long factors(long n,long f /* Remove the default */) {
... // the rest of your code
}
Вы можете достичь этого, передав счет в качестве ссылки —
#include<iostream>
using namespace std;
long long factors(long n, int& count, long f=1)
{
if(n%f==0)
{
cout<<f<<endl;
count = count + 1;
}
if(f==n)
return 0;
factors(n, count, f+1);
return 0;
}
int main()
{
int n,t;
cin>>t;
while(t--)
{
cin>>n;
int count = 0;
factors(n, count);
cout << count << endl;
}
return 0;
}
-Gaurav
Во-первых, почему вы объявляете переменную count в глобальном пространстве?
Во-вторых, вы не можете выполнять арифметические операции с необъявленной переменной (в этом случае int «count» никогда не объявляется).
В-третьих, почему вы создаете бесконечный цикл, выполняя while (t—)?
Вы сказали, что функция дает 0 для всех входных данных,
Может ли это быть из-за того, что счет никогда не объявляется?