Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 8 odgovora
  • 4.996 pregleda

Najnovija ↓

sabiranje i množenje 6cifrenih brojeva 26.04.2004. u 23:30 · pre 274 meseca #1
Kako napraviti u PASCALU program da prepoznaje brojeve vece od onih kojih nam on dozvoljava??
primjer;

treba mi program koji traži da unesemo dva broja sa 6 cifara i da napiše njihov zbir i proizvod?

[Ovu poruku je menjao -zombie- dana 27.04.2004. u 18:18 GMT]
Re: pascal-(..PROGRAM)????????????????I need that 27.04.2004. u 09:44 · pre 274 meseca #3
Ne moze preko tipa LONGINT.
Skoro je bilo na takmicenju,kazu da se moze uraditi.
VJEROVATNO POSTOJI NEKA CAKA..
mozda nekako preko brojnih stringova
Re: pascal-(..PROGRAM)????????????????I need that 27.04.2004. u 14:57 · pre 274 meseca #5
Evo ja cu da ti dam ideju pa ti uradi nesto a mi cemo da ispravimo greske.
Definisi a,b,c i d kao longint. Ucitaj prva dva broja u neka dva stringa.
Prva 3 karaktera u prvom stringu pretvori u broj i smesti u a. druga 3 karaktera pretvori u broj i smesti u b (imas funkcije za to, ne secam se imena funkcija davno sam se igrao sa Pascalom).
Isto tako uradi sa drugim brojem i smeti odgovarajuce brojeve u c i d.
Sada uradi ovo:
poslednje3cifre:=b*d mod 1000;
pretposlednje3cifre:=(b*d div 1000) + ((a*d+b*c) mod 1000);
prvih6cifara:=a*c+ ((a*d+b*c) div 1000);
Write(prvih6cifara:6, pretposlednje3cifre:3, poslednje3cifre:3);

To resenje se dobija iz sledece formule:
(a*10000+b)*(c*10000+d)=a*c*1000*1000+a*d*1000+b*c*1000+b*d

To ti je resenje za mnozenje a za sabiranje ne moras da izvodis nikakve formule nego samo pretvori prva 2 stringa u longintove i saberi ih.
Re: pascal-(..PROGRAM)????????????????I need that 27.04.2004. u 20:35 · pre 274 meseca #7
Citat:
srki:
Evo ja cu da ti dam ideju pa ti uradi nesto a mi cemo da ispravimo greske.
Definisi a,b,c i d kao longint. Ucitaj prva dva broja u neka dva stringa.
Prva 3 karaktera u prvom stringu pretvori u broj i smesti u a. druga 3 karaktera pretvori u broj i smesti u b (imas funkcije za to, ne secam se imena funkcija davno sam se igrao sa Pascalom).
Isto tako uradi sa drugim brojem i smeti odgovarajuce brojeve u c i d.
Sada uradi ovo:
poslednje3cifre:=b*d mod 1000;
pretposlednje3cifre:=(b*d div 1000) + ((a*d+b*c) mod 1000);
prvih6cifara:=a*c+ ((a*d+b*c) div 1000);
Write(prvih6cifara:6, pretposlednje3cifre:3, poslednje3cifre:3);

To resenje se dobija iz sledece formule:
(a*10000+b)*(c*10000+d)=a*c*1000*1000+a*d*1000+b*c*1000+b*d

To ti je resenje za mnozenje a za sabiranje ne moras da izvodis nikakve formule nego samo pretvori prva 2 stringa u longintove i saberi ih.


Eh, da... ovo me pomalo podseca na mnozenje u dvostrukoj preciznosti koje se "povlaci" jos od asemblera :)...
Potpis
ex Strog

http://www.zeussoftware.rs
Re: sabiranje i množenje 6cifrenih brojeva 28.04.2004. u 14:00 · pre 274 meseca #8
ucitavaj direktno u niz cifara, i to u inverznom redosledu tako da cifra najvece tezine bude skroz desno. tako ti je lakse da uradis ako imas prenos cifara, da ne shiftas cifre. ne moras cak nigde da koristis (long) integer. aj ako me ne mrzi poslacu ti source u toku dana...
pozdravi
Potpis
Ride the rainbow, crack the sky

DIY gitare, pojacala i efekti www.diy-fever.com
Re: sabiranje i množenje 6cifrenih brojeva 28.04.2004. u 15:18 · pre 274 meseca #9
evo ti kod. napisao sam u delphi, al ako ne umes da prebacis onda bem li ga :)

Code:

program Mnozenje;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var A, B, C, D: string;
    Action: char;

function Vrednost(c: char): byte;
begin
  Result := Ord(c) - 48;
end;

procedure Saberi(A, B: string; var C: string);
var p, i: byte;
begin
  //da se izjednace duzine A, B i C
  while Length(A) > Length(B) do
    B := '0' + B;
  while Length(A) < Length(B) do
    A := '0' + A;
  SetLength(C, Length(A));

  //sabiranje cifra po cifra
  p := 0;
  for i := Length(A) downto 1 do
   begin
     C[i] := Chr((p + Vrednost(A[i]) + Vrednost(B[i])) mod 10 + 48);
     p := (p + Vrednost(A[i]) + Vrednost(B[i])) div 10;
   end;

  //ako ima prenos dodati na pocetak
  if p > 0 then
   C := Chr(p + 48) + C;
end;

procedure Mnozi(A, B: string; var C: string);
var i, j, p: byte;
    temp: char;
begin
  //da se izjednace duzine A, B i C i postaviti C na 0;
  while Length(A) > Length(B) do
    B := '0' + B;
  while Length(A) < Length(B) do
    A := '0' + A;
  SetLength(C, 2 * Length(A));
  for i := 1 to Length(C) do
   C[i] := '0';

  //mnozenje cifra po cifra
  p := 0;
  for i := Length(A) downto 1 do
   begin
     for j := Length(A) downto 1 do
       begin
         temp := Chr((p + Vrednost(C[i + j]) + Vrednost(A[i]) * Vrednost(B[j])) mod 10 + 48);
         p := (p + Vrednost(C[i + j]) + Vrednost(A[i]) * Vrednost(B[j])) div 10;
         C[i + j] := temp;
       end;
     //ako ima prenosa dodati na pocetak tekuceg sabirka
     if p > 0 then
      begin
        C[i] := Chr(p + 48);
        p := 0;
      end;
   end;

  //obrisati prve nule
  while C[1] = '0' do
    Delete(C, 1, 1);
end;

begin
  while True do
   begin
     Write('A = '); ReadLn(A);
     Write('B = '); ReadLn(B);
     WriteLn;
     Saberi(A, B, C);
     WriteLn('A + B = ', C);
     Mnozi(A, B, D);
     WriteLn('A * B = ', D);
     WriteLn(#13, 'Nastaviti? (D/N)');
     ReadLn(Action);
     if UpCase(Action) = 'N' then
      Break;
   end;
end.


pozdravi
Potpis
Ride the rainbow, crack the sky

DIY gitare, pojacala i efekti www.diy-fever.com
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme