Дополнительный «0» на выходе при разложении числа на множители

#c #function #factors

#c #функция #факторы

Вопрос:

Напишите функцию int fact(int n) , которая отображает множители целого n числа и возвращает количество множителей. Вызовите эту функцию main() с помощью пользовательского ввода

 #include<iostream>
using namespace std;

int fact(int n);

int main() {
    int n,factor;
    cout << "Enter an integer : ";
    cin >> n;
    factor = fact(n);
    cout << factor;
    return 0;
}

int fact(int n)
{
    for (int i = 1; i <= n;   i) 
    {
        if (n % i == 0)
        cout << i << endl;
    }
    return 0;
}
 

Если я ввожу 7 , я получаю 1,7,0 . Как мне удалить это 0 и как мне найти количество факторов?

Комментарии:

1. Финал 0 исходит из этой строки: cout << factor; . Поскольку fact() всегда возвращается 0 , это то, что вы получаете.

2. Вы должны считать на самом деле. Установите для переменной значение 0 и увеличивайте его при каждом текущем отображении i . Затем в конце функции вместо возврата 0 возвращает переменную count .

Ответ №1:

Вы должны учитывать в своей int fact() функции. Установите для переменной значение 0 и увеличивайте его каждый раз, когда вы в данный момент отображаете i. Затем в конце функции вместо возврата 0 возвращает переменную count .

 int fact(int n)
{
    int  count=0;

    for (int i = 1; i <= n;   i) 
    {
        if (n % i == 0) {
           cout << i << endl;
           count  ;
        }
    }
    return count;
}
 

Ответ №2:

Ключевая часть — «и возвращает количество факторов». Вы этого не делаете. Продолжайте подсчитывать коэффициенты:

 int fact(int n)
{
    int count = 0;
    for (int i = 1; i <= n;   i) 
    {
        if (n % i == 0)
        {
            // found a factor, add to the count
            count  ;
            cout << i << endl;
        }
    }
    // return the count instead
    return count;
}
 

Затем ваша основная функция может использовать это количество:

 factor = fact(n); // fact(n) will already print the factors
// now just print the number
cout << "Number of factors: " << factor << 'n';
 

Ответ №3:

 #include <iostream>
#include <vector>

std::vector<int> fact(int n);

int main() {
  int n;
  std::cout << "Number: ";
  std::cin >> n;
  std::vector<int> factors = fact(n);

  for (auto i : factors) {
    std::cout << i << ' ';
  }
  std::cout << 'n';

  std::cout << "Number of factors: " << factors.size() << 'n';

  return 0;
}

std::vector<int> fact(int n) {
  std::vector<int> vec{1};
  for (int i = 2; i <= n / 2;   i) {
    if (n % i == 0) {
      vec.push_back(i);
    }
  }
  vec.push_back(n);

  return vec;
}
 

Если вы собираетесь возвращать что-либо из fact() , это должны быть факторы. Для этого я использую a std::vector . Это массив, который может увеличиваться по требованию. Числа 1 и n всегда являются факторами, поэтому я не утруждаю себя математикой для них. Вектор инициализируется уже со значением 1, и я вычисляю только числа до половины n включительно (все, что больше n / 2, не будет делиться равномерно, поэтому мой цикл завершается примерно вдвое быстрее, распознав фактический диапазон). Затем я просто добавляю n к вектору, который я возвращаю.

Мой main выводит вектор, и вектор знает свой собственный размер, который является числом факторов.

В качестве альтернативы, вы можете просто сохранить счетчик в своей fact() функции.

 #include <iostream>
#include <vector>

// Prints factors of n and returns the number of factors
int fact(int n);

int main() {
  int n;
  std::cout << "Number: ";
  std::cin >> n;
  int numFactors = fact(n);

  std::cout << "Number of factors: " << numFactors << 'n';

  return 0;
}

int fact(int n) {
  int factorCount = 2;  // Already counting 1 and n
  std::cout << "1 ";
  for (int i = 2; i <= n / 2;   i) {
    if (n % i == 0) {
      std::cout << i << ' ';
        factorCount;
    }
  }
  std::cout << n << 'n';

  return factorCount;
}
 

Комментарии:

1. Это очень хороший момент. Это не очень хорошая программа для обработки некоторых результатов и возврата других. Наиболее естественным является возврат всех факторов в виде вектора. И вы получаете количество от размера вектора.

Ответ №4:

Основная проблема вашего кода заключается в том, что ваша функция всегда возвращает ноль. Вам нужно вести подсчет коэффициентов и возвращать его.

Кроме того, ваша производительность кода ухудшается, поскольку цикл продолжается намного дольше, чем необходимо. Вы можете использовать квадратный корень из n в качестве предела в for цикле. Нравится:

 int fact(int n)
{
    if (n < 1) return 0;

    int res = 0;
    int limit = sqrt(n);
    for (int i = 1; i <= limit;   i) 
    {
        if (n % i == 0)
        {
            res  = 2;
            cout << i << " - " << n/i << endl;
        }
    }
    if (limit * limit == n)
    {
        --res;
    }
    
    return res;
}
 

Для n = 36 вывода:

 1 - 36
2 - 18
3 - 12
4 - 9
6 - 6
 

и возвращаемое значение равно 9

Ниже приведен другой подход. Он не использует квадратный корень. Вместо этого он сохраняет количество циклов на низком уровне, используя квадрат i as loop limit .

 int fact(int n)
{
    if (n < 1) return 0;

    int res = 0;
    int i = 1;
    int i_square = i * i;
    while (i_square < n)
    {
        if (n % i == 0)
        {
            res  = 2;
            cout << i << " - " << n/i << endl;
        }
        
          i;
        i_square = i * i;
    }
    if (i_square == n)
    {
          res;
        cout << i << " - " << n/i << endl;
    }
    
    return res;
}
 

Ответ №5:

Fact() всегда возвращает 0, поэтому в этой строке выводится 0

   cout << factor;
 

для количества факторов вы можете изменить возвращаемое значение fact() :

 int fact(int n)
{
    int nb = 0;
    for (int i = 1; i <= n;   i) 
    {
        if (n % i == 0) {
           cout << i << endl;
           nb  ;
        }
    }
    return nb;
}
 

Комментарии:

1. Спасибо. но как мне найти количество факторов? Например, когда пользователь вводит 6, функция отображает «1, 2, 3, 6», и возвращает 4 как количество факторов;