#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 как количество факторов;