ostatnia liczba

AW
  • Rejestracja:około 9 lat
  • Ostatnio:około 3 lata
  • Postów:19
0

Jest to zadanie ze SPOJ i nie mam pojęcia jak dokończyć, a muszę wyznaczyć ostatnią cyfrę liczby wyniku z potęgowania. Może wy mnie jakoś nakierujecię bym dał rade rozwiazać to.. ? Wynik np. 27 i ma byc widoczna tylko 7.

Kopiuj
#include <iostream>
#include<math.h>
using namespace std;
int main()
{
    int a,b,ile;
    cin>>ile;
    for(int i=1; i<=ile; i++)
    {
            cin>>a>>b;
            cout<<pow(a,b)<<endl;
    }
    return 0;
}

edytowany 1x, ostatnio: awium
fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
1

modulo z 10. Zawsze da Ci ostatnia liczbe

AW
o Modulo myślałem ale gdzie tego nie dopisałem to zawsze błąd mi wyskoczył
twonek
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
2

27 % 10 daje 7

Ale od razu ostrzegam, że jak będziesz potęgował "na pałę" i dopiero potem brał ostatnią cyfrę, to nie zaliczysz wszystkich testów. Trzeba pewną rzecz zauważyć odnośnie reszty z dzielenia przez 10.

AW
  • Rejestracja:około 9 lat
  • Ostatnio:około 3 lata
  • Postów:19
0

a ten kod który napisałem jest ok? Tylko muszę Modulo zastosować czy bardziej funkcje pow wyrzucić i zamienić czymś innym?

edytowany 1x, ostatnio: awium
twonek
Przecież mój post zawiera odpowiedź na te pytania.
VX
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 6 lat
  • Postów:18
0

A zauważ jak zachowuje się cyfra jedności w potęgach.
Jaką cyfrę jedności ma np. 6n i 46n albo 96n
Jak zachowuje się cyfra jedności np. podczas 71, 72, 73, 74, 75, 76 itd.


"Nie śmiej się ze mnie tylko dlatego, że wciąż czegoś nie umiem. Kiedy to opanuję, będę kimś."
edytowany 2x, ostatnio: VereX
bogdans
Wziąłeś sobie do serca sygnaturkę i opanowałeś wstawianie indeksów górnych. :)
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
1

Ostatnia cyfra iloczynu 235769863*3792577 jest identyczna z ostatnią cyfrą iloczynu 3*7 (mnożymy ostatnie cyfry). Analogiczna reguła jest prawdziwa dla dowolnych liczb.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
2
Kopiuj
    #include <stdio.h>
     
    int main() 
      {
       unsigned T,a,b;
       for(scanf("%u",&T);T--;printf("%c\n",(10*(b&3)+(a%10))["0161656161012345678901496569410187456329"])) scanf("%u%u",&a,&b);
       return 0;
      } 

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Zobacz pozostałe 11 komentarzy
_13th_Dragon
To proste, ten "śmieszny argument" to wcale nie argument lecz opis obserwowanej rzeczywistości.
bogdans
@janusz_programowania, to jest nas dwóch nierozumiejących.
KM
nie, ma zrozumieć, że ponieważ problem tak blachy że da się zrobić w jednej linijce, to jak porządnie się zastanowi to sam da radę zrozumieć i napisać. Jeśli chcesz, żeby się porządnie zastanowił, to po pierwsze nie dawaj gotowców. Dwa że IMHO takim postem jedyne co uzyskasz, to konfuzję u OP. Zastanowić się (być może) zastanowi, ale nie dzięki Twojemu postowi, bo nie zrozumie wiadomości, którą chciałeś mu przekazać. Skoro nawet @bogdans musiałeś tłumaczyć jak należy rozumieć Twojego posta, to tym bardziej OP. Bo OP słabiej Cię zna a więc i komunikacja gorsza.
_13th_Dragon
@kmph, nie musiałem tłumaczyć, jeżeli ktoś nie zrozumiał intencji to widocznie ten post był nie dla niego - proste. Dla pytającego patrzy na to widzi jeden wiersz ale niczego nie rozumie. Więc ma dylemat albo zrobić metodą Kopiego Pejsta ale wtedy jest ryzyko że nie zaliczy bo jedno pytanie - leży i kwiczy; albo jednak przerobić na coś zrozumiałego dla niego. W przypadku przerobienia to znowu ma dylemat samemu rozkminić problem - to się nauczy tego albo zrozumieć co w tym kodzie napisano - to się nauczy jeszcze więcej. Więc źle jest tylko dla ryzykującego lenia ...
_13th_Dragon
... oraz obrońców tego lenia.
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
1

Myślę, że przydatna będzie funkcja

Kopiuj
int multiply(int n,int m)
{
    return ((n % 10)*(m % 10)) % 10;
}

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
AW
  • Rejestracja:około 9 lat
  • Ostatnio:około 3 lata
  • Postów:19
0

tym razem wykazał mi sędzia "przekroczono limit czasu"

Kopiuj
#include <iostream>
using namespace std;
long int potega(int p, int w)
{
    if (w==0) return 1;
    else return p*potega(p,w-1);
}
int main()
{
    int ile,p,w;
    cin>>ile;
    for(int i=1; i<=ile; i++)
    {
        cin>>p>>w;
        cout<<potega(p,w)%10<<endl;
    }
}
edytowany 3x, ostatnio: awium
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

No a co ci ma wypisać? Nie przeczytałeś ze zrozumieniem żadnego postu w tym temacie chyba. Nadal potęgujesz te liczby, do tego jeszcze rekurencyjnie o_O Nie zrozumiałeś tego co bodans napisał?
123456789123456789 ma taką samą ostatnią cyfrę jak 99. Nie trzeba wykonywać całego takiego mnożenia żeby poznać wynik. Jakbym sie ciebie zapytał jaka jest ostatnia cyfra liczby:
123456789123456789*1234567890 to też byś to najwpierw wszystko wymnożył dokładnie?


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
SI
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 3 godziny
0

W ten sposób tego nie zrobisz, wychodzą takie wyniki że nie mieszczą się w żadnej dostępnej w c(++) zmiennej. Python "twierdzi" że np 8 do potęgi 100 ma 91 cyfr, a tym danym wejściowym przecież daleko do maksymalnych.

bogdans
Maksymalne wartość p i w, to 10^9. Trzeba zatem znaleźć miejsce na liczbę mającą 1+10^18 cyfr. Nawet Python polegnie.
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

Dodam jeszcze, że komunikat sędziego był inny niż "przekroczono limit czasu". Ten kod ma błąd składniowy, więc programu się nie uruchomi. Trochę Ci podpowiem, zamiast

Kopiuj
        cin>>p>>w;
        cout<<potega(p,w)%10;<<endl;

daj

Kopiuj
        cin>>p>>w;
        p = p % 10;
        cout<<potega(p,w)%10<<endl;

Może już wystarczyć, jeśli nie, to podrasuj funkcję potega.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans
AW
twierdzisz ze kłamie?
bogdans
Tego nie twierdzę, nie mam konta na SPOJ-u i nie wiem jak SPOJ reaguje na błędny składniowo kod. Przypuszczam, że tak jak IDEONE http://ideone.com/ULufX2. Jest też możliwe, że inny kod wysłałeś na SPOJ-a, a inny wkleiłeś na forum.
AW
  • Rejestracja:około 9 lat
  • Ostatnio:około 3 lata
  • Postów:19
0

Kod wkleiłem taki jak podałem "Wam". Nie mam w zwyczaju oszukiwać, zwłaszcza osób które proszę o rade ale to moje stanowisko nie każdy musi taki być.

<img src=http://naforum.zapodaj.net/thumbs/ab6fdf5acde5.jpg alt=hosting zdjęć zapodaj.net />

Ale już dość, zbytnio oddaliłem się od tematu który mnie interesuje.

edytowany 1x, ostatnio: awium
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

Najprostsze (najszybsze to już podałem) co powinno przejść to:

Kopiuj
        cin>>p>>w;
        cout<<((int)pow(p%10,4+w%4))%10<<endl;

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 2x, ostatnio: _13th_Dragon
Zobacz pozostały 1 komentarz
_13th_Dragon
"W pierwszej linii wejścia znajduje się jedna liczba całkowia D (1≤D≤10), oznaczjąca liczbę przypadków do rozważenia. Opis każdego przypadku podany jest w jednym wierszu, zawierającym dwie liczby naturalne a i b oddzielone pojedynczym odstępem (spacją), takie, że (1 ≤ a,b ≤ 1 000 000 000)." - to ze SPOJ'a - miliard rekurencyjnie - nie przejdzie.
bogdans
Nie wiem czy zauważyłeś, że w Twoim kodzie jest w%4. Zatem najwyżej trzy rekurencyjnie. :D
_13th_Dragon
W tym - tak ale mówiliśmy o tamtym kodzie. Przy maksymalnej potędze 3 - absolutnie nie widzę sensu w rekurencji.
bogdans
Ja mówiłem o tym kodzie (z operatorami modulo), a przy okazji, ten kod jest błędny. Też nie widzę sensu w rekurencji, ja tylko napisałem że się nada.
_13th_Dragon
No tak, drobna kosmetyka, właściwie to sprowadzić do potęg 1..4.
SI
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 3 godziny
0

Żeby ten kod dostał przekroczono limit czasu, starczy usunąć nadmiarowy średnik z couta (po %10). Bez tego daje błąd kompilacji.

bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

A teraz już Ci zarzucę kłamstwo, założyłem konto na SPOJ-u, wysłałem Twój kod i zobaczyłem to: spoj.png.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
AW
mi teraz też taki rezultat wyświetlił
AW
masz racje bogdans dałem inny kod na forum w ostatniej linijce wkradł mi się ";" a na spoj-u go w kodzie nie mam tutaj jest błąd " cout<<potega(p,w)%10;<<endl; "
AW
zrobiłem to nieświadomie ale jednak. Po usunięciu błąd kompilacji znika. Moja wina.
AW
  • Rejestracja:około 9 lat
  • Ostatnio:około 3 lata
  • Postów:19
0

masz racje bogdans dałęm inny kod na forum w ostatniej linijce wkradł mi sie ";" a na spoju go w kodzie nie mam tutaj jest błąd

edytowany 2x, ostatnio: Shalom
0
_13th_Dragon napisał(a):

Najprostsze (najszybsze to już podałem) co powinno przejść to:

Kopiuj
        cin>>p>>w;
        cout<<((int)pow(p%10,w%4))%10<<endl;

P=2 w=4 wynik powinien być 6, Twoj kod daje 1

bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0
Kopiuj
        w = w % 4;
        if(w == 0) 
        {
            w = 4;
        }
        cout << ((int)pow(p%10,w))<< endl;

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans
_13th_Dragon
@bogdans koniecznie musisz sobie życie utrudniać: cout&lt;&lt;((int)pow(p%10,1+(3+w)%4))%10&lt;&lt;endl; ?
bogdans
@_13th_Dragon, imho, to Ty sobie życie utrudniłeś. Przed napisaniem Twojego wzoru trzeba trochę pomyśleć, a swój napisałem bez myślenia. Bardziej podoba mi się wzór z postu niżej: (w-1)%4+1.
_13th_Dragon
@bogdans, bez myślenia to: 4+w%4 co do minusu to akurat trzeba pomyśleć, % od liczb ujemnych - zawsze wymaga zastanowienia się.
bogdans
@_13th_Dragon, 4+w%4 niepotrzebnie zwiększa wykładniki. O jakich liczbach ujemnych ty piszesz (w&gt;=1)?
nalik
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 2 lata
  • Postów:1039
0

Istnieje cykl, trzeba bylo policzyc sobie kilka pierwszych wyników a potem sprawdzić kiedy cykl sie rozpoczyna od nowa. W problemach algorytmicznych trzeba czasami pomyśleć, a nie robić na pałę.

Kopiuj
import sys
matrix = [
    ["1\n","1\n","1\n","1\n"],
    ["2\n","4\n","8\n","6\n"],
    ["3\n","9\n","7\n","1\n"],
    ["4\n","6\n","4\n","6\n"],
    ["5\n","5\n","5\n","5\n"],
    ["6\n","6\n","6\n","6\n"],
    ["7\n","9\n","3\n","1\n"],
    ["8\n","4\n","2\n","6\n"],
    ["9\n","1\n","9\n","1\n"],
    ["0\n","0\n","0\n","0\n"],
]

test_num = int( sys.stdin.readline() )
for test_num in xrange(0, test_num):
    input = sys.stdin.readline().split(' ')
    sys.stdout.write( matrix[(int(input[0])-1)%10][(int(input[1])-1)%4] )

Albo po prostu

Kopiuj
test_num = int(raw_input())
for test_num in xrange(0, test_num):
    input = raw_input().split(' ')
    a = int(input[0])
    b = (int(input[1])-1)%4+1
    x = 1
    for i in xrange(0, b):
        x *= a
        x %= 10
    print x
edytowany 2x, ostatnio: nalik
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)