[Pascal] funkcja sprawdzająca podzielność

ct985
Użytkownik
Użytkownik
Posty: 184
Rejestracja: 13 paź 2011, o 20:36
Płeć: Kobieta
Lokalizacja: Warszawa
Podziękował: 71 razy

[Pascal] funkcja sprawdzająca podzielność

Post autor: ct985 »

Dany jest plik tekstowy w którym w każdej linii jest zapisana jedna liczba dodatnia w systemie siódemkowym, napisz procedurę, która sprawdzi czy wszystkie liczby w tym pliku dzielą się prze 3.

Jak zamienić liczby z zapisu siódemkowego na dziesiętny, żeby sprawdzić podzielność?
adambak
Użytkownik
Użytkownik
Posty: 1272
Rejestracja: 8 sty 2011, o 18:18
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 295 razy
Pomógł: 115 razy

[Pascal] funkcja sprawdzająca podzielność

Post autor: adambak »

e tam od razu zamieniać.. trik z sumą cyfr podzielną przez \(\displaystyle{ 3}\) w systemie siódemkowym też działa..

ale jeśli chcesz koniecznie zamienić najpierw na liczbę dziesiętną to prosze bardzo:

Kod: Zaznacz cały

function PToDec(n,p:integer):integer;
var dec,d,s:integer;
begin
  dec:=0; d:=1;
  while n>0 do begin
    s:=n mod 10;
    dec:=dec+s*d;
    d:=d*p; n:=(n-s) div 10;
  end;

  PToDec:=dec;
end;
funkcja przyjmuje liczbę \(\displaystyle{ n}\) o podstawie \(\displaystyle{ p}\) i zwraca ją w postaci dziesiętnej..



wersja z sumą cyfr:

Kod: Zaznacz cały

function suma_cyfr(n:integer):integer;
var s,a:integer;
begin
  s:=0;
  while n>0 do begin
    a:=n mod 10;
    s:=s+a;
    n:=(n-a)div 10;
  end;

  suma_cyfr:=s;
end;
jest nawet nieco prostsza i potem wystarczy jedno sprawdzenie podzielności sumy cyfr..

-- 19 lut 2012, o 21:35 --

specem od Pascala nie jestem, ale tam jest napisane plik tekstowy?
no to tym bardziej wersja z sumą cyfr (pewnie nawet autorowi zadania o to chodziło).. do eolna czytamy po znaku (skoro w jednej linii jedna liczba i to w dodatku dodatnia) i przy eolnie mamy już sumę cyfr liczby w danym wierszu..
ct985
Użytkownik
Użytkownik
Posty: 184
Rejestracja: 13 paź 2011, o 20:36
Płeć: Kobieta
Lokalizacja: Warszawa
Podziękował: 71 razy

[Pascal] funkcja sprawdzająca podzielność

Post autor: ct985 »

Dziękuję bardzo za pomoc
Grzesio_
Użytkownik
Użytkownik
Posty: 44
Rejestracja: 23 gru 2011, o 22:59
Płeć: Mężczyzna
Lokalizacja: Polska
Pomógł: 3 razy

[Pascal] funkcja sprawdzająca podzielność

Post autor: Grzesio_ »

Kod: Zaznacz cały

var s:string; i, k:integer; w:boolean;
begin
        w:=true;
        repeat
                readln(s);
                k:=0;
                for i:=1 to length(s) do
                        k:=k + ord(s[i])-48;
                w:=w and (k mod 3=0);
        until eof or (not w);
        writeln(w)
end.
istotnym jest ominięcie traktowania wejściowej liczby jako liczby dziesiętnej
bo np. '66666' siódemkowo to tylko 16806 dziesiętnie
a MAXINT bywa że równy tylko 32767
traktowanie wejścia jako ciąg siódemkowych cyfr dramatycznie zmienia dziedzinę
bo np. możemy sprawdzić liczbę='6666666666666666666666666666666666666666666666
66666666666666666666666666666666666666666666666666666666666666666666666666
6666666666666666666666666666666666666666666666666666666666666666666666666
66666666666666666666666666666666666666666666666666666666666666'
bo string mieści tylko 255 znaków, ale...
Ostatnio zmieniony 20 lut 2012, o 12:32 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
ODPOWIEDZ