Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #define limit 10e6 //pocet prednacteni ulozeni cisel do souboru viz uloz_prvocisla()
- // V2 program vypise 10^6 cisel do souboru. Pote umi se souborem pracovat
- // V3 jiz spravne rozklada na prvocisla a cte scanf dokud neni zadana 0.
- // V3 neumi:
- // output nejak normalne vypsat a ne az po provedeni cele funkce
- // osetrit aby hodilo error kdyz zadam pismeno
- // V5 verze 6 plne funkcni, dodelat Coding style
- // V6 bug: nacitane hodnoty jsou pouze int -> nestaci asi
- // V7 potrebne hodnoty prepsany na llu
- // bug: pokud se program snazi nalezt prvocislo vetsi nez 10e6 /neni v souboru/ tak bezi do nekonecna
- // problem: timeout u testu man4-5-6. V6 tento problem nemela
- // uprava: funkce pekny tisk je nejaka hnusna
- void uloz_prvocisla(void);
- void del(void);
- void hledej_prvocisla(long long int);
- void pekny_tisk(long long int *, int);
- int main(int argc, char *argv[])
- {
- long long int zadane;
- uloz_prvocisla();
- while (scanf("%llu", &zadane) == 1 && zadane >= 0)
- {
- if (zadane == 0)
- exit(0);
- else if (zadane == 1)
- printf("Prvociselny rozklad cisla 1 je:\n1\n");
- else
- {
- printf("Prvociselny rozklad cisla %llu je:\n", zadane);
- hledej_prvocisla(zadane);
- }
- }
- fprintf(stderr, "Error: Chybny vstup!\n");
- return 100;
- }
- void hledej_prvocisla(long long int zadane)
- {
- long long int current = 0;
- int count = 0;
- long long int pole[100]; //pocet rozlozenych prvocisel
- FILE *soubor_cisla;
- soubor_cisla = fopen("ulozena_cisla.txt", "r");
- while (current <= zadane)
- {
- fscanf(soubor_cisla, "%llu", ¤t);
- if (current <= zadane)
- {
- while (zadane % current == 0)
- {
- zadane /= current;
- // printf("%d ", current);
- pole[count] = current;
- count += 1;
- }
- }
- }
- fclose(soubor_cisla);
- pekny_tisk(pole, count);
- }
- void pekny_tisk(long long int *pole, int count) //funkce naformatuje vystup a vytiskne to tak jak to chce jebanej Brute
- {
- int i, mocnina = 1;
- for (i = 0; i < count; i++)
- {
- // printf("[%d]", i);
- if (count - i != 1)
- {
- if (pole[i] == pole[i + 1])
- mocnina += 1;
- else if (mocnina > 1)
- {
- printf("%llu^%d x ", pole[i], mocnina);
- mocnina = 1;
- }
- else
- printf("%llu x ", pole[i]);
- }
- else
- {
- if (pole[i] == pole[i + 1])
- mocnina += 1;
- else if (mocnina > 1)
- {
- printf("%llu^%d", pole[i], mocnina);
- mocnina = 1;
- }
- else
- printf("%llu", pole[i]);
- }
- }
- printf("\n");
- }
- void uloz_prvocisla()
- {
- FILE *soubor;
- soubor = fopen("ulozena_cisla.txt", "w");
- unsigned long long int i, j;
- int *primes;
- primes = malloc(sizeof(int) * limit);
- for (i = 2; i < limit; i++)
- primes[i] = 1;
- for (i = 2; i < limit; i++)
- if (primes[i])
- for (j = i; i * j < limit; j++)
- primes[i * j] = 0;
- for (i = 2; i < limit; i++)
- if (primes[i])
- fprintf(soubor, "%llu\n", i);
- free(primes);
- fclose(soubor);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement