[Lập trình newbie] Mỗi ngày một bài toán (số 3)

Chào một ngày mới tươi đẹp :sogood:.
Bài này là một bài toán khá quen thuộc:
[LEFT]Cho hai số nguyên dương A và B ( A & B có không quá 1000 chữ số )
Yêu cầu:Tính A + B, A - B, A * B[/LEFT]
Chú ý:
[LEFT]Khi kết quả là 0 các bạn phải in ra 0, nếu in -0 là sai
Các chữ số 0 không có nghĩa ở đầu không được in ra.
VD 013 thì phải in ra là 13, chữ số 0 ở đầu không có nghĩa[/LEFT]
Input
[LEFT]**Dòng 1: số nguyên A
**Dòng 2: số nguyên B[/LEFT]
Output
[LEFT]**Dòng 1: Kết quả A + B
****Dòng 2: Kết quả A - B
**Dòng 3: Kết quả A * B[/LEFT]
Example
Input:
10
11
Output:
21
-1
110
Nguồn: http://vnoi.info
Let’s go :dreaming:

này dùng mảng à :D. Này từng làm rồi, h mần lại :smiley:

Mã số bài này là gì vậy anh, để em còn nộp xem mình làm đúng hay sai nữa

Mã bài “[LEFT]BIGNUM[/LEFT]” :happy:

làm sao để in ra a/b đây, =))

2 ngày 1 bài đi a, đuối wa :frowning: cứ ngày chẵn (hoặc lẻ) ra đề ,hixhix

[QUOTE=09520434;65121]làm sao để in ra a/b đây, =))[/QUOTE]
a/b thì số lớn vs số nguyên thì dễ, còn 2 số lớn thì hình như khá phức tạp :brick:

Khi nào có một bạn giải được coi như kết thúc (có post code và kết quả) :shy:

code pascal dc ko anh :nosebleed:

oạch, chưa có ai giải hết à, sắp hết ngày rồi, :-s

[QUOTE=quoctinvn;65176]code pascal dc ko anh :nosebleed:[/QUOTE]
Code pascal cũng được :smiley:

{$H+}
uses math;
const
fi = '';
fo = '';
digit = 9;
base = 1000000000;
maxd = 250;
type
bigint = array[1..maxd+1] of int64;
var
f1,f2 : text;
procedure openfiles;
begin
assign(f1,fi); reset(f1);
assign(f2,fo); rewrite(f2);
end;
procedure closefiles;
begin
close(f1); close(f2);
end;
operator + (var a,b : bigint) c : bigint;
var
i,cr : longint;
begin
fillchar(c,sizeof(c),0);   cr := 0;
for i := maxd downto 1 do
begin
c* := a*+b*+cr;
if c* > base then
begin
c* := c*-base;
cr := 1;
end
else cr := 0;
end;
end;
operator * (var a,b : bigint) c : bigint;
var
i,j,k,cr : longint;
begin
fillchar(c,sizeof(c),0);
for i := maxd downto 1 do
begin
cr := 0;
for j := maxd downto 1 do
if i+j > maxd then
begin
k := i+j-maxd;
c[k] := c[k]+a**b[j]+cr;
cr := c[k] div base;
c[k] := c[k] mod base;
end;
end;
end;
operator - (var a,b : bigint) c : bigint;
var
i,cr : longint;
begin
fillchar(c,sizeof(c),0);   cr := 0;
for i := maxd downto 1 do
begin
c* := a*-b*-cr;
if c* < 0 then
begin
c* := c*+base;
cr := 1;
end
else cr := 0;
end;
end;
operator >= (var a,b : bigint) c : boolean;
var
i : longint;
begin
for i := maxd downto 1 do if a*=0 then break;
if b* <> 0 then exit(false);
while (a* = b*) and (i < maxd) do inc(i);
if a*>=b* then exit(true) else exit(false);
end;
function valueOf(a : string) : bigint;
var
i : longint;
q : string;
begin
fillchar(valueOf,sizeof(valueOf),0);   i := maxd;
while length(a) > 0 do
begin
q := copy(a,length(a)-digit+1,digit);
val(q,valueOf*);
delete(a,max(1,length(a)-digit+1),digit);
dec(i);
end;
end;
function tostring(a : bigint) : string;
var
i : longint;
s,q : string;
begin
for i := 1 to maxd do if a* <> 0 then break;
if a*=0 then exit('0');
str(a*,q); s := q;
for i := i+1 to maxd do
begin
str(a*,q);
while length(q) < digit do q := '0'+q;
s := s+q;
end;
exit(s);
end;
procedure solve;
var
a,b : string;
aa,bb : bigint;
begin
readln(f1,a); readln(f1,b);
aa := valueOf(a); bb := valueOf(b);
writeln(f2,tostring(aa+bb));
if aa>=bb then
writeln(f2,tostring(aa-bb))
else
writeln(f2,'-',tostring(bb-aa));
writeln(f2,tostring(aa*bb));
end;
begin
openfiles;
solve;
closefiles;
end.

fang cái code pascal lên vậy :go:
thuật tính số lớn bằng mảng của em là như vầy : thay vì mỗi lần cộng trừ nhân lần lượt các chữ số của 1 số, thì mình sẽ cộng trừ nhân mỗi lần digit chữ số của 2 số đó. Như trong code của em là 9 chữ số. Kết quả được lưu trong mảng gồm 250 phần tử, mỗi phần tử đại diện cho 9 chữ số của số đó.

Mình nghĩ code post lên nên là ngôn ngữ C/C++ vì là ngôn ngữ trường mình dạy đầu tiên, nên mọi người ai cũng hiểu. Chứ post những ngôn ngữ khác, có những bạn ko biết ngôn ngữ đó thì chẳng hiểu code và học hỏi được gì cả. Với lại code post lên phải là bài làm đúng (đã accepted khi nộp).

[QUOTE=10520355;65192]Mình nghĩ code post lên nên là ngôn ngữ C/C++ vì là ngôn ngữ trường mình dạy đầu tiên, nên mọi người ai cũng hiểu. Chứ post những ngôn ngữ khác, có những bạn ko biết ngôn ngữ đó thì chẳng hiểu code và học hỏi được gì cả. Với lại code post lên phải là bài làm đúng (đã accepted khi nộp).[/QUOTE]

C++ là ngôn ngữ đầu tiên ở UIT, Pascal là ngôn ngữ của người ta học từ thời cấp 3 thậm chí cấp 2; với lại ở đây đích chính là trao đổi giải thuật chứ đâu có trao đổi code.
Ngôn ngữ càng thấp giải 1 bài toán sẽ chứng tỏ khả năng của người giải hơn là một ngôn ngữ cao.

Pascal học từ thời cấp 3, nhưng chỉ có những lớp chuyên tin mới học thôi. Với các bạn cấp 3 ko phải chuyên tin hay chưa học pascal, thì C là ngôn ngữ đầu tiên. Yêu cầu post code là của chủ topic, mình chỉ góp ý thôi mà. Xét về mặt giải thuật thì pascal ngang với C++.

bài em ac trên spoj rồi ạ.
[QUOTE=10520355;65192]Mình nghĩ code post lên nên là ngôn ngữ C/C++ vì là ngôn ngữ trường mình dạy đầu tiên, nên mọi người ai cũng hiểu. Chứ post những ngôn ngữ khác, có những bạn ko biết ngôn ngữ đó thì chẳng hiểu code và học hỏi được gì cả. Với lại code post lên phải là bài làm đúng (đã accepted khi nộp).[/QUOTE]

Ủa. Sao anh lấy nộp thử thì wrong answer nhỉ???

àh xin lỗi em quên.
ở phần đầu code thêm vào {$H+} đi ạ. cái này là hướng dẫn biên dịch cho pascal tự động chuyển string thành ansistring :aboom:


{$H+}
uses math;
const
   fi = '';
   fo = '';
   digit = 9;
   base = 1000000000;

cái phần in ra kết quả thì chuyển thành xâu để in ra nên vượt quá 255 kí tự string thông thường của pascal nên dùng ansistring. chắc ở C/C++ cũng có tương tự :brick:

quoctinvn cho anh hỏi, thuật toán của em là chuyển sang cơ số 10^9, lưu trữ các số lớn dưới dạng mảng các chữ số và thực hiện các phép +, -, * tương tự như khi tính tay không?
Mình nghĩ những bạn post bài giải nên ghi thêm giải thuật cho mọi người dễ theo dõi và học hỏi.

quoctinvn, nếu em học trường UIT, anh nghĩ em nên tham gia đội tuyển Olympic của trường. Anh thấy thuật giải và kĩ thuật code của em tốt đấy.

edit thuật ở trên rồi ạ.
tks anh vì lời khen :happy: thực ra em cũng ham đi thi Olympic, nhưng mà còn nhiều dự định khác. Với lại được vào đội tuyển của trường hay không là chuyện khác ạ :beatbrick:
[QUOTE=10520355;65253]quoctinvn cho anh hỏi, thuật toán của em là chuyển sang cơ số 10^9, lưu trữ các số lớn dưới dạng mảng các chữ số và thực hiện các phép +, -, * tương tự như khi tính tay không?
Mình nghĩ những bạn post bài giải nên ghi thêm giải thuật cho mọi người dễ theo dõi và học hỏi.

quoctinvn, nếu em học trường UIT, anh nghĩ em nên tham gia đội tuyển Olympic của trường. Anh thấy thuật giải và kĩ thuật code của em tốt đấy.[/QUOTE]