因式分解数字时输出额外的“0”

Extra "0" in output when factorizing a number

编写一个函数 int fact(int n) 显示整数 n 的因数,以及 returns 因数的个数。使用用户输入

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 以及如何找到因子的数量?

Fact() 总是 returns 0 所以这一行打印 0

  cout << factor;

对于可以更改 fact() 的 return 值的因素数:

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

关键部分是“和returns因子的个数”。你不那样做。统计因素:

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

你应该算在你的 int fact() 函数中。将变量设置为 0 并在当前每次显示 i 时递增。然后在函数的末尾而不是 returning 0 return 计数变量。

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

    for (int i = 1; i <= n; ++i) 
    {
        if (n % i == 0) {
           cout << i << endl;
           count++;
        }
    }
    return count;
}
#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;
}

如果你要 return 来自 fact() 的任何东西,它应该是这些因素。为此,我使用了 std::vector。它是一个可以按需增长的数组。数字 1 和 n 始终是因数,因此我不会费心为它们做数学运算。向量已初始化并保持值 1,我只计算 n 的一半(任何大于 n/2 的数字都不会均分,所以我的循环通过识别实际的速度完成大约一半的速度范围)。然后我将 n 添加到向量中,我 return.

我的main打印vector,vector知道自己的大小,也就是因子的个数。

或者,您可以只在 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;
}

您的代码的主要问题是您的函数总是 return 为零。您需要计算因素并 return 它。

除此之外,您的代码性能很差,因为循环持续的时间比需要的长得多。您可以使用 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

并且 returned 值为 9

下面是另一种方法。它不使用平方根。相反,它通过使用 i 的平方作为循环限制来保持较低的循环数。

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