Sprawdzanie czy mnożenie spowoduje błąd "overflow"

0

Witam,

Chce sprawdzac czy dana liczba unsigned long long dzieli sie kolejno przez liczby typu 9 * 1, 90 * 2, 900 * 3, 9000 * 4 itd. i przestac wtedy kiedy czesc calkowita z takiego dzielenia wyniesie zero.

Jak moge sprawdzic czy taki z czasem duzy dzielnik nie spowoduje overflowu, tj nie bedzie wiekszy od ULLONG_MAX?

1

Po pierwsze zastanów się czy ten problem nadal będzie występował jak powiem Ci, że:
(a * b) % c == ((a % c) * (b % c)) % c

Po drugie, jeśli dzielna jest mniejsza od dzielnika to odpowiedź na Twoje pytanie to zawsze "NIE" (reszta nie wyniesie 0).

Do warunku wyżej mogę dodać np.:
Twoje dzielenie: a / (b * c)
jeśli (a / b) < c to odpowiedź to też "NIE" (czyli nie musisz w ogóle mnożyć)

Po trzecie, możesz sprawdzać dla Twojego dzielenia a / (b * c)
(a % c ==0) && (a % b == 0)
jeśli liczba a dzieli się przez b*c to i dzieli się przez nie z osobna

Jeśli nadal się boisz o overflow, najprostszy sposób na sprawdzenie to:
jeśli a * b = c, poszło bez problemu to warunki:
c / b == a
c / a == b
c % a == 0
c % b == 0
muszą być prawdziwe (po overflowie prawdpodobnie nie będą)

0
 unsigned long long den=0,newden=9;
for(int i=10;newden/i==den;newden=den*(i+=10)) cout<<(den=newden)<<endl;
0

Nie wiem czy zrozumieliscie o co mi chodzi. Mam podana liczbe oznaczajaca ilosc cyfr, mam podac liczbe oznaczajaca ilosc kolejnych liczb, ktore mozna ulozyc z takiej ilosci cyfr. Np. dla 113 (cyfr) odpowiedzia jest 61 (liczb).

Liczb jednocyfrowych jest 9, sklada sie na nie 91 cyfr, liczb dwucyfrowych jest 90, sklada sie na nie 902 cyfr. Wiec pomyslalem zeby dzielic dzieleniem calkowitym liczbe cyfr (np. 113) przez kolejno 91, 902 itd., az czesc calkowita bedzie rowna zero z takiego dzielenia.

Przykladowo: 113 / 9 -> czesc calkowita nie jest rowna zero, 113 / 180 = 0.[jakies cyfry]. Wiec potem od 113 odejmuje poprzedni dzielnik, tj. 9*1 i mam 104. 104/2 = 52. 52 + 9 = 61.

Ale to jest nieistotne, chce wiedziec po prostu czy takie mnozenie [ilosc_liczb_N_cyfrowych]*[N] nie bedzie wieksze od ULLONG_MAX za ktoryms razem...

0

Algorytmu który chcesz zrealizować nie zrozumiałem. Może zbyt zagmatwanie opisałeś. Natomiast kod który podałem miał wypisywać ci właśnie te dzielniki, oczywiście kropnąłem się po drodze:
http://ideone.com/Ly3aoN

9
180
5400
216000
10800000
648000000
45360000000
3628800000000
326592000000000
32659200000000000
3592512000000000000

i to wszystko, zauważ że daleko do 113 znaków

1 użytkowników online, w tym zalogowanych: 0, gości: 1