Advertisement
Guest User

Rozklad na prvocisla V7 Vojta

a guest
Feb 27th, 2020
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.49 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define limit 10e6 //pocet prednacteni ulozeni cisel do souboru viz uloz_prvocisla()
  4.  
  5.  
  6.  
  7. // V2 program vypise 10^6 cisel do souboru. Pote umi se souborem pracovat
  8. // V3 jiz spravne rozklada na prvocisla a cte scanf dokud neni zadana 0.
  9. // V3 neumi:
  10. //     output nejak normalne vypsat a ne az po provedeni cele funkce
  11. //      osetrit aby hodilo error kdyz zadam pismeno
  12.  
  13. // V5 verze 6 plne funkcni, dodelat Coding style
  14. // V6 bug: nacitane hodnoty jsou pouze int -> nestaci asi
  15. // V7 potrebne hodnoty prepsany na llu
  16. //      bug: pokud se program snazi nalezt prvocislo vetsi nez 10e6 /neni v souboru/ tak bezi do nekonecna
  17.     //  problem: timeout u testu man4-5-6. V6 tento problem nemela
  18.         // uprava: funkce pekny tisk je nejaka hnusna
  19.  
  20.        
  21. void uloz_prvocisla(void);
  22. void del(void);
  23. void hledej_prvocisla(long long int);
  24. void pekny_tisk(long long int *, int);
  25.  
  26. int main(int argc, char *argv[])
  27. {
  28.     long long int zadane;
  29.     uloz_prvocisla();
  30.  
  31.     while (scanf("%llu", &zadane) == 1 && zadane >= 0)
  32.     {
  33.         if (zadane == 0)
  34.             exit(0);
  35.         else if (zadane == 1)
  36.             printf("Prvociselny rozklad cisla 1 je:\n1\n");
  37.  
  38.         else
  39.         {
  40.             printf("Prvociselny rozklad cisla %llu je:\n", zadane);
  41.             hledej_prvocisla(zadane);
  42.         }
  43.     }
  44.  
  45.     fprintf(stderr, "Error: Chybny vstup!\n");
  46.     return 100;
  47. }
  48.  
  49. void hledej_prvocisla(long long int zadane)
  50. {
  51.     long long int current = 0;
  52.     int count = 0;
  53.     long long int pole[100]; //pocet rozlozenych prvocisel
  54.     FILE *soubor_cisla;
  55.     soubor_cisla = fopen("ulozena_cisla.txt", "r");
  56.     while (current <= zadane)
  57.     {
  58.         fscanf(soubor_cisla, "%llu", &current);
  59.         if (current <= zadane)
  60.         {
  61.  
  62.             while (zadane % current == 0)
  63.             {
  64.                 zadane /= current;
  65.                 // printf("%d ", current);
  66.                 pole[count] = current;
  67.                 count += 1;
  68.             }
  69.         }
  70.     }
  71.     fclose(soubor_cisla);
  72.     pekny_tisk(pole, count);
  73. }
  74.  
  75. void pekny_tisk(long long int *pole, int count) //funkce naformatuje vystup a vytiskne to tak jak to chce jebanej Brute
  76. {
  77.     int i, mocnina = 1;
  78.     for (i = 0; i < count; i++)
  79.     {
  80.         // printf("[%d]", i);
  81.         if (count - i != 1)
  82.         {
  83.             if (pole[i] == pole[i + 1])
  84.                 mocnina += 1;
  85.             else if (mocnina > 1)
  86.             {
  87.  
  88.                 printf("%llu^%d x ", pole[i], mocnina);
  89.                 mocnina = 1;
  90.             }
  91.             else
  92.                 printf("%llu x ", pole[i]);
  93.         }
  94.         else
  95.         {
  96.             if (pole[i] == pole[i + 1])
  97.                 mocnina += 1;
  98.             else if (mocnina > 1)
  99.             {
  100.                 printf("%llu^%d", pole[i], mocnina);
  101.                 mocnina = 1;
  102.             }
  103.             else
  104.                 printf("%llu", pole[i]);
  105.         }
  106.     }
  107.     printf("\n");
  108. }
  109.  
  110. void uloz_prvocisla()
  111. {
  112.     FILE *soubor;
  113.     soubor = fopen("ulozena_cisla.txt", "w");
  114.  
  115.     unsigned long long int i, j;
  116.     int *primes;
  117.  
  118.     primes = malloc(sizeof(int) * limit);
  119.  
  120.     for (i = 2; i < limit; i++)
  121.         primes[i] = 1;
  122.  
  123.     for (i = 2; i < limit; i++)
  124.         if (primes[i])
  125.             for (j = i; i * j < limit; j++)
  126.                 primes[i * j] = 0;
  127.  
  128.     for (i = 2; i < limit; i++)
  129.         if (primes[i])
  130.             fprintf(soubor, "%llu\n", i);
  131.     free(primes);
  132.     fclose(soubor);
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement