Разложение числа на простые множители - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Мир всем. Написал вот такую вот программу для разложения числа на простые множители с использованием решета Эратосфена, ради ускорения работы. И всё меня устраивает, ввод как нужен, вывод, почти как нужен. Никак не могу добиться того, что бы если среди простых чисел на которые было разложено число, встречались повторяющиеся, то их бы выводило как n^k, где n число и k степень(кроме 1 есстественно). Прошу о помощи, заранее благодарствую.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
 
void Factorization(long long num, _Bool SieveArray[])
{
    long long div = 2, to_facotrize = num;
 
    printf("Prime factorization of %lli:\n", num);
    while (div < to_facotrize)
    {
        if (SieveArray[div] == 1) 
        {
            if (to_facotrize % div == 0)
            {
 
                printf("%lli x ", div);
                to_facotrize /= div;
            } 
 
            else {
                if ( div == 2 ) div = 3;
                else div += 2;
            }
        } else {
            div += 2;
        }
    }
    printf("%lli\n", div);
}
 
int main(int argc, char const *argv[])
{
    clock_t start, end;
    start = clock();
    void Factorization(long long num, _Bool SieveArray[]);
 
    // Sieve of Eratosthenes 
    long long n = 1000001, i, j;
    long long sqrt_n = sqrt(n);
 
    _Bool SieveArray[n];
    SieveArray[0] = 0, SieveArray[1] = 0;
 
    for (i = 2; i < n; i++)
        SieveArray[i] = 1;
 
    for (i = 2; i < sqrt_n; i++)
        if (SieveArray[i])
            for (j = i*i; j < n; j+=i)
                SieveArray[j] = 0;

    long long num;
    while( 1 ) 
    {
        if (scanf("%lld", &num) != 1) {
            fprintf(stderr, "Error: Undefined stdin!\n");
            return 100;
        } else {
            if ( num == 1 ) {
                printf("Prime factorization of 1:\n1\n");
            } else if ( num < 0 ) {
                fprintf(stderr, "Error: Undefined stdin!\n");
                return 100;
            } else if ( num == 0 ) {
                break;
            } else if ( num < 1000001 ) {
                if (SieveArray[num] == 1) {
                    printf("Prime factorization of %lli:\n%lli\n", num, num);
                } else {
                    Factorization(num, SieveArray);
                }   
            } else {
                Factorization(num, SieveArray);
            }
        }
    }
 
    end = clock();
    double time_taken = ((double) (end - start)) / CLOCKS_PER_SEC;
    printf("It's took %f seconds to execute\n", time_taken);
 
    return 0;
}
Неужели никаких вариантов?

Решение задачи: «Разложение числа на простые множители»

textual
Листинг программы
void Factor(long long num0)
{
   printf("%lld=", num0);
   char z[2] = "";
   for(d=2,flag=0; num > 1; d+= (d==2) ? 1 : 2) {
       if (d*d > num0 && flag==0) {
         printf("Prime");
         break;
       }
       for(count=0; num%d==0; count++) num /= d;
       if (count==0) continue;
       if (count==1) printf("%s%d", z, d);
       else printf("%s%d^%d", z, d, count);
       strcpy(z, "*");
       flag=1;
   }
   printf("\n");
}

Объяснение кода листинга программы

  1. Входное значение функции — длинное число num0.
  2. Вывод на экран строки с числом в формате =num0.
  3. Инициализация пустой строки z.
  4. Переменная d инициализируется значением 2, а флаг переменной flag устанавливается равным 0.
  5. Цикл while (d <= num0/d) {...} — выполняется до тех пор, пока d не станет больше num0/d.
  6. Если d*d больше num0 и флаг равен 0, то выводится слово Prime и цикл прерывается.
  7. Цикл for (count=0; num%d==0; count++) — выполняется до тех пор, пока num не будет делиться на d без остатка.
  8. Переменная count используется для подсчета количества раз, когда d делит num.
  9. Если count равно 0, то цикл продолжается.
  10. Если count равно 1, то к строке z добавляется значение d.
  11. Если count больше 1, то к строке z добавляется символ ^, значение d и значение count.
  12. Строка z заменяется на *.
  13. Переменная flag устанавливается равным 1.
  14. Цикл завершается.
  15. Выводится на экран строка в формате =z.
  16. Ввод/вывод данных завершается.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.111 из 5
Похожие ответы