Diskuze: Urychleni algoritmu

C++ C a C++ Urychleni algoritmu

Avatar
honza.b4
Člen
Avatar
honza.b4:

Zdravim. prohlednete si tento zdrojak:

#include <stdio.h>
#include <stdlib.h>
long long int a, b, x, y, k=0, i=1;
int main(){
scanf("%lld %lld %lld %lld", &a, &b, &x, &y);
FILE *s;
s = fopen("reseni.txt", "w+");
printf("\npostup: \n\n");
long long int z = a/100;
long long int p = z*i;
do{
    if((a%x)==0 && (a%y)==0){
        printf("Nalezeny pocet reseni: %lld\n", k);
        k++;
    }
    if(a == p){
        printf("jsem v %lld procentech", i);
        i++;
    }

    a++;
}while(a != b+1);

printf("\n%lld\n\n", k);
fprintf(s, "%lld", k);
return 0;
}

na vstupu mam ziskat rozmezi cisel a-b a potom delitele x a y;
kdyz je nejake cislo z rozmezi a-b delitelne obema deliteli x a y, tk je

k++;

jenze, kdyz je na vstupu rozmezi cisel a-b 858 miliard, tak to muj comp do konce zivota nestihne. Nevite, jak to podstatne urychlit?

diky za pomoc vsem!:D

 
Odpovědět 27.1.2014 14:17
Avatar
Odpovídá na honza.b4
Libor Šimo (libcosenior):

zakomentuj riadky:
printf("Nalezeny pocet reseni: %lld\n", k);
a
printf("jsem v %lld procentech", i);

Nahoru Odpovědět 27.1.2014 14:31
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):

Zadal som naozaj veľké číslo (trvanie 95 sek) a tu je výstup:

Editováno 27.1.2014 14:36
Nahoru Odpovědět 27.1.2014 14:36
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
honza.b4
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
honza.b4:

zajimavy. co mas za CPU? :D

Editováno 27.1.2014 14:38
 
Nahoru Odpovědět 27.1.2014 14:37
Avatar
Odpovídá na honza.b4
Libor Šimo (libcosenior):

Intel(R)Core(TM)2 Duo CPU
E8300@2.83GHz
2.83GHz 0,98GB RAM

Nahoru Odpovědět 27.1.2014 14:42
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
honza.b4
Člen
Avatar
Odpovídá na honza.b4
honza.b4:

muj os: ubuntu 13.10 x64
muj cpu: core i3 330m 2,13 GHz dvoujadro

vstup: 146305278845 868444855111 97899 408438

cas vypoctu: ?. jeste to neskoncilo

 
Nahoru Odpovědět 27.1.2014 14:43
Avatar
Odpovídá na honza.b4
Libor Šimo (libcosenior):

Ja to ale nevypisujem, ak si si nevšimol.

Nahoru Odpovědět 27.1.2014 14:44
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na honza.b4
Libor Šimo (libcosenior):

Tvoje zadanie trvalo 66 sek.

BTW
Možno by bolo zaujímavejšie správne čísla ulokladať do toho súboru a potom ich z neho vypísať.

Editováno 27.1.2014 14:51
Nahoru Odpovědět 27.1.2014 14:50
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
honza.b4
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
honza.b4:

aha. tkze to nebude zdrojakem, ale nejakym vnejsim vlivem.

 
Nahoru Odpovědět 27.1.2014 14:51
Avatar
Odpovídá na honza.b4
Libor Šimo (libcosenior):

Zakomentoval si tie dva riadky, čo som ti písal?

Nahoru Odpovědět 27.1.2014 14:52
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
honza.b4
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
honza.b4:

zakomentoval. program znovu zkompiloval a furt nic...

 
Nahoru Odpovědět 27.1.2014 14:54
Avatar
Odpovídá na honza.b4
Libor Šimo (libcosenior):

Skús toto:

#include <stdio.h>
#include <stdlib.h>
long long int a, b, x, y, k=0, i=1;
int main(){
    scanf("%lld %lld %lld %lld", &a, &b, &x, &y);
    FILE *s;
    s = fopen("reseni.txt", "w+");
    printf("\npostup: \n\n");
    long long int z = a/100;
    long long int p = z*i;
    do{
        if((a%x)==0 && (a%y)==0){
            k++;
        }
        if(a == p){
            i++;
        }

        a++;
    }while(a != b+1);

    printf("\n%lld\n\n", k);
    fprintf(s, "%lld", k);
    fclose(s);

    return 0;
 }
Nahoru Odpovědět 27.1.2014 14:55
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na honza.b4
Libor Šimo (libcosenior):

Aj keď tie premenné

long long int a, b, x, y, k=0, i=1;

sú zbytočne globálne.

Nahoru Odpovědět 27.1.2014 14:58
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
honza.b4
Člen
Avatar
 
Nahoru Odpovědět 27.1.2014 15:00
Avatar
Odpovídá na honza.b4
Libor Šimo (libcosenior):

Doteraz som to testval na win xp, doma testnem na ubuntu 12.04.

Nahoru Odpovědět 27.1.2014 15:22
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
honza.b4
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
honza.b4:

uz nemusis, ale diky za pomoc.

predelal sem komplet zdrojak na toto a uz to fachci:

#include <stdio.h>
#include <stdlib.h>

gcd (long long int a, long long int b)
{
  if (!b) return a;
  return gcd(b, a % b);
}

int main (void){
  long long int a, b, x, y, k, lcm;
  FILE *s;
  scanf("%lld %lld %lld %lld", &a, &b, &x, &y);
  s = fopen("reseni.txt", "w+");
  lcm = x * y / gcd(x, y);
  k = b/lcm - a/lcm;
  printf("\n%lld\n\n", k);
  fprintf(s, "%lld", k);
  return 0;
}
Editováno 27.1.2014 15:26
 
Nahoru Odpovědět 27.1.2014 15:26
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 16 zpráv z 16.