Portál AbcLinuxu, 8. května 2025 20:21
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 az B 858 miliard, tak to muj comp do konce zivota nestihne. Nevite, jak to podstatne urychlit?
diky za pomoc vsem!:D
Řešení dotazu:
k
má být počet čísel mezi a
a b
, které mají být dělitelné součinem x*y
, tak by to mělo být napřímo.k = b/(x*y)-a/(x*y)bez žádných cyklů. (tedy doufám, že v integer dělení
A/B
se mi fakticky provede floor(A/B)
tedy dostanu celočíselnou část toho podílu.)
a
a b
nemaji byt delitelna soucinem x*y
, ale soucasne cislem x
a y
. Tve reseni funguje tedy spravne pouze pro nesoudelna x
a y
. Spravne reseni by bylo k = b/lcm(x,y)-a/lcm(x,y)
long long int 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; }
int i; for(i = 1; i*x*y < b; i++){ k++; }Samozřejmě ten kód nahoře není dokonalý a chce to ošetřit okrajové podmínky pečlivěji (např. inicializovat i tak, aby první výsledek vycházel do daného rozmezí), ale jako ukázka to stačí. Taky pozor na záporná x a y. P.S. trochu mi to smrdí školním domácím úkolem. Tak bych se nedivil, kdyby tě s tím někdo poslal do míst, kam slunce nesvítí.
for(i = ((a/x/y*x*y==a)?a/x/y:a/x/y+1); i*x*y < b; i++){
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.