Operacja przecunięcia na int ?

0

Witam,

Mam sobie zmienną int powiedzmy o wartości 45463, i teraz pytanie czy da się jakoś pozbyć 2 pierwszych cyfr, tak żeby użyć w programie tyko tej reszty ?

Pozdrawiam

0

Tak, wziąć resztę z dzielenia przez 1000

0

Tylko jak ? Bo modulo nie zwraca tego co trzeba.

Pozdrawiam

2

To chyba u ciebie, bo u mnie 45463%1000 zwraca 463

0

usunięcie dwóch pierwszych z której strony? może chodzi Ci o podzielenie przez 100? ;D

0

Nie, chodzi mi o to, że na przykład mam "1 % 3" i zwraca mi 1 a powinno 333333...

Pozdrawiam

0

Że niby co? o_O
reszta z dzielenia 1 przez 3 to jest 1 bo
1/3 = 0 plus 1 reszty

0

Tak też myślałem, ale jak można się dobrać do tego co jest po przecinku ?

1

Czy ty jesteś normalny? W pierwszym poscie opisałeś coś zupełnie innego, a teraz piszesz o czymś innym. Zdecyduj się!
Możesz to zamienić na stringa i traktować to jako symbole. Jak chcesz odciąć elementy po przecinku to wystarczy że zrobisz liczba - (int)liczba

0

Najedź sobie na górę strony i przeczytaj na głos nazwę działu. Tak jest to "Newbie" więc proszę nie obrażaj mnie, zwyczajnie źle sformułowałem pytanie.

Chodzi mi o to że dzielę przez sobie dwa inty a później wyświetlam to w formie ("%d,%d",całość,reszta).

Pozdrawiam

0

printf("%d, %d", pierwszy_int/drugi_int, pierwszy_int%drugi_int);

0
Karolaq napisał(a)

printf("%d, %d", pierwszy_int/drugi_int, pierwszy_int%drugi_int);

Otóż nie bo wyświetli dla na przykład 1 przez 3 0,1 a powinno 0,3333..
Chyba już znalazłem na to rozwiązanie, sprawdzę tylko i napisze.

Pozdrawiam

0
std::cout<<(double)1/3;
0
kopernik napisał(a)
std::cout<<(double)1/3;

Nie mogę użyć C++, musi być czyste C i nie mogę użyć też formatu double, float itp musi być tylko int, ale już wymyśliłem :)

Mam tylko jeszcze jedno pytanie mam sobie zmienią int na przykład: "5658745" jak mogę sobie znak po znaku przepisać do tablicy ?

Pozdrawiam

0
printf("%f",(float)1/3);

To jest tylko rzutowanie i możesz to zrobić w C.
Możesz to zrobić jeszcze tak:

printf("%f",1.0/3.0);

Co i tak jest jednoznaczne z zapisem wyżej..
Twoje następne pytanie.. Możesz to zrobić za pomocą div i mod czyli / i %.
W pętli..
reszta z dzielenia przez 10, to jedna cyferka, Liczba = liczba div 10.
i tak dopóki liczba!=0

A jak Sobie z tym poradziłeś? Na moje coś nas tutaj ściemniasz.

0

Nie ściemniam :)

Mam tak pytam się o ilość miejsc po przecinku i przypisuje do zmiennej X = pow(10,poprzecinku) i wtedy ułożyłem sobie taki wzór:

wynik (to przed przecinkiem) = liczba1 / liczba2
reszta = ((liczba1 - (wynik*liczba2)) * X) / liczba2

I zwraca mi ok tak jak chcę czyli dla 1 / 3 reszt 333 itp.

teraz tylko powalczę z przepisaniem tej zmiennej do tablicy i dam znać jak poszło.

Pozdrawiam

0

Zwraca coś innego bo X jest zmiennoprzecinkowy, więc cały iloraz też jest tak traktowany. Czyli i tak korzystasz floatów

0

Może podaj po prostu treść zadania bo coś mi tu nie podoba.

0

Program ma przyjmować trzy inty (ilość cyfr po przecinku, dzielną i dzielnik) a potem zaokrąglić wynik do zadanej ilości miejsc po przecinku i wyświetlić.
Moja wersja działa bez problemu na małych liczbach (na przykład 1/3, 247/2000 czy 259998 20000) i zaokrągla tak jak trzeba, ale tylko jak podam mu na przykład 5 miejsc po przecinku. Jak podam mu 100 miejsc lub więcej to dzieje się coś dziwnego bo reszta jest liczbą ujemną.

Pozdrawiam i bardzo proszę o pomoc :(

0

a no widzisz
stu miejsc po przecinku w żaden normalny sposób działania na liczbach nie otrzymasz
musisz zrobić pętlę i dzielić ręcznie tak jak dzieli się w słupku

algorytm sobie napisz sam, ma to wyglądać mniej więcej tak
13/7 = 1 (1,)
13%7 = 6
6 * 10 = 60
60/7 = 8 (1,8)
60%7 = 4
4 * 10 = 40
40/7 = 5 (1,85)
40%7 = 5
50/7 = 7 (1,857)
itd...

a iteracji ma być tyle ile chcesz miejsc po przecinku

0

Ok dziękuję, zaraz nad tym pomyślę i może się uda, ale mam jeszcze takie inne pytanie.

Rozpisałem sobie ten mój wzór na kawałki żeby lepiej było widać co jest nie tak i wygląda on tak:

        reszta1 = wynik*dzielnik;
        reszta2 = dzielna - reszta1;
        reszta3 = reszta2 * ilosc;
        reszta4 = reszta3 / dzielnik;

I teraz dla przykładu biorę sobie 9 miejsc po przecinku czyli zmienna ilosc = 9 000 000 000 i liczby 5 przez 14 tak więc:

reszta1 = 0 * 14 =0
reszta2 = 5 - 0 = 5
reszta3 = 5 * 9000000000 = 45000000000
reszta4 = 45000000000 / 14 = 3214285714

a tym czasem komputer wypluwa dla tych wartości takie wyniki:

reszta1 = 0
reszta2 = 5
reszta3 = -2147483648
reszt4 = -153391689

Dlaczego tak jest bo nie rozumiem ?

Pozdrawiam

Edit: Chyba już wiem, int nie może tego przechować. Zmieniłem na long long int i nie ma już wartości ujemnych.

0

to raczej podstawy informatyki
int ma 32 bity, przy czym pierwszy bit z lewej to bit znaku, a pozostałe 31 to liczba
może przechować tylko liczby do 31 bitów - czyli maksymalnie 2^31 - 1 = 2147483647

jeżeli spróbujesz wpisać do niego liczbę 2147483648 to wchodzisz na bit znaku i zamiast tego dostajesz liczbę ujemną -2147483648
i tak w kółeczko - liczba zawsze będzie w zakresie <-2147483648; 2147483647>

możesz wyrzucić bit znaku oznaczając int jako unsigned - wtedy masz zakres <0; 4294967295> ale to nadal za mało żeby dostać 100 liczb po przecinku

// edit: unsigned long long int też Ci dużo nie daje bo zwiększa zakres "zaledwie" do 18 446 744 073 709 551 615 - jak widać to nadal za mało żeby przechować 100 cyfr

1

Teraz to mi się całkiem pomieszało :) Otóż mam do tego zadania napisaną sprawdzarkę w bashu. Ma 108 testów z czego 48 mój program przechodzi a resztę nie.

Otóż na przykład test o numerze 101 wpisuje takiej wartości:

Ilość dzieleń:8
Ilość miejsc po przecinku: 100000
Działenie1:99999999 100000000
Działenie2:100000000 99999999
Działenie3:9 10
Działenie4:1 99999999
Działenie5:99999999 1
Działenie6:19 99
Działenie7:1999 9999
Działenie8:100 111

Liczby zwracane są tak długie że nie mieszczą się na ekranie nawet, więc nie mam pomysłu jak dla takich wartości trzeba to zrobić ? Bo nawet long long int nie przechowa takiej zmiennej.

Pozdrawiam

0

Szukaj pod hasłami "długie liczby" czy "wielkie liczby" itp. oraz "algorytm dzielenia".

0

o ile rozumiem pytanie masz jakas liczbe
int liczba = 1234567890;

i chcesz pozbyc sie jakiejs ilosci cyfr z prawej lub z lewej. Proponuje przekonwertowac liczbe na tekst funkcja itoa(), a nastepnie uciac co tam chcesz i funkcja atoi() przekonwertowac z powrotem na inta :)

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