Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2014, 12:51   #1
Илмет
 
Регистрация: 08.10.2014
Сообщений: 3
По умолчанию Факторизация числа. Си

Доброго времени суток.
Появилась проблема с такой задачей: необходимо разложить вводимое число на простые сомножители, причём с функцией, в которую передаётся число, а отдаётся в main массив разложений.
Получилось сделать само по себе разложение в виде
Код:
#include <stdio.h>
#include <math.h>
int main()
{
    double n, i;
    scanf("%lf", &n);
    i = 2;
    while (i<=sqrt(n))
        if((int)n % (int)i == 0) {
            printf("%.0lf*",i);
            n = n/i;
        } else
            i = i+1;
    printf("%.0lf",n);
    return 0;
}
Но не получается найти инфу о том, как загнать цикл в функцию (точнее как сделать функцию, возвращающую массив).
Был бы крайне признателен за помощь.

Последний раз редактировалось Илмет; 08.10.2014 в 14:52.
Илмет вне форума Ответить с цитированием
Старый 08.10.2014, 14:54   #2
Илмет
 
Регистрация: 08.10.2014
Сообщений: 3
По умолчанию

Особо хотел отметить (это принципиально в данном случае), что код на обычном Си, не С++.
Илмет вне форума Ответить с цитированием
Старый 08.10.2014, 15:22   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

1. Зачем тип double, хотя там должен быть int?
2. Как-то так примерно с double получится:
Код:
int f(double n, double *a, int len)
{
  double i;
  int a_i = 0;
  i = 2;
    while (i<=sqrt(n))
        if((int)n % (int)i == 0) {
            a[a_i] = i;
            ++a_i; 
            n = n/i;
        } else
            i = i+1;
    a[a_i] = n;

    return a_i + 2;
}
в функцию нужно передать "разлагающееся" число, массив под сомножители и максимальное количество сомножителей, которое в этот массив влезет (проверку тоже нужно в функции дописать, я не стал, ибо лень). Возвращает функция количество сомножителей, которое в итоге в массив записали.
т.е. main будет каким-то таким:
Код:
int main()
{
    double n;
    double a[10];
    scanf("%lf", &n);
    
    int count = f(n, a, 10);

    for (int i = 0; i < count-1; ++i)
      printf("%.0lf*",a[i]);
    printf("%.0lf",a[count-1]);

    return 0;
}
pu4koff вне форума Ответить с цитированием
Старый 08.10.2014, 15:50   #4
Илмет
 
Регистрация: 08.10.2014
Сообщений: 3
По умолчанию

Спасибо.
А для чего передаётся len в функцию? Он ведь в ней не используется ни разу, как я посмотрел.

Последний раз редактировалось Илмет; 08.10.2014 в 16:00.
Илмет вне форума Ответить с цитированием
Старый 08.10.2014, 17:23   #5
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

я же написал, что по-хорошему нужно его проверять, что a_i < len. Суть в том, что сишные массивы не хранят размер и функция не знает на область какого размера ей передали указатель и сколько элементов туда запишется. Пока места хватает, всё хорошо, а дальше уже будет много интересного с записью данных не туда, куда нужно. Можно не передавать массив в функцию, а создавать его и менять размер по необходимости внутри функции, но в этом случае обычно забывают очистить память от этого массива и в целом не самая лучшая практика. Для обучения всё равно, любой вариант прокатит.
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать программу,имеющая процедуру,кторая в производном текстовом файле,которая имеет слова и числа,изменяющая все числа числа,ме Fingergod Паскаль, Turbo Pascal, PascalABC.NET 0 13.12.2012 20:08
Задачи в ТурбоПаскаль: найти числа Армстронга и просуммировать числа в последовательности номера которых простые числа Lena1808 Помощь студентам 1 17.05.2012 08:00
Факторизация на асме bagfinder Помощь студентам 1 21.04.2011 14:12
Delphi 7. ро-метод Полларда (факторизация числа) Pecho Помощь студентам 2 03.01.2011 20:29