Tin học Cộng trừ các số nguyên lớn hơn 2^64

Bùi Thành Công

Học sinh
Thành viên
23 Tháng bảy 2018
87
58
31
20
Nam Định
Thcs Giao Thủy
[TẶNG BẠN] TRỌN BỘ Bí kíp học tốt 08 môn
Chắc suất Đại học top - Giữ chỗ ngay!!

ĐĂNG BÀI NGAY để cùng trao đổi với các thành viên siêu nhiệt tình & dễ thương trên diễn đàn.

hi, chào các bạn, mình mới nghĩ ra được một cách làm tính với các số nguyên quá lớn, số đươc nhập vào dưới dạng string, kết quả cũng là kiểu string luôn. Chỗ nào thiếu sót gì ae chỉnh lại hộ mình nha:D
Code đây:
Mã:
Program cong_tru_nhan_chia;
uses crt;
var n,i:LongInt;
    z,s:ansistring;
//cong
function cong(s2,s1:ansistring):ansistring;
var z:ansistring;
    n1,n2,i,g,d,du:LongInt;
    code:Integer;
begin z:='';
  while Length(s2)>Length(s1) do s1:='0'+s1;
  while Length(s1)>Length(s2) do s2:='0'+s2;
  s1:='0'+s1;s2:='0'+s2;g:=Length(s2);du:=0;
  for i:=g downto 1 do
  begin
    Val(s1[i],n1,code);
    Val(s2[i],n2,code);
    d:=n1+n2+du;
    if d>=10 then du:=1 else du:=0;
    d:=d MOD 10;
    z:=Chr(d+48)+z;
    end;
  if z[1]='0' then delete(z,1,1);
  cong:=z;
end;
//tru
function tru(sl,sb:ansistring):ansistring;
var n1,n2,i,g,d,du:LongInt;
    z:ansistring;
    code:Integer;
begin  z:='';
  if length(sl)<length(sb) then exit('0');
  if (length(sl)=length(sb)) then
  for i:=1 to length(sl) do if (ord(sl[i])<ord(sb[i])) then exit('0');
  while length(sb)<Length(sl) do sb:='0'+sb;
  g:=Length(sl);du:=0;
  for i:=g downto 1 do
  begin
    Val(sl[i],n1,code);
    Val(sb[i],n2,code);
    if n1<n2+du then
    begin d:=n1+10-n2-du;du:=1; end
    else begin d:=n1-n2-du;du:=0; end;
    z:=Chr(d+48)+z;
    end;
  if z[1]='0'then delete(z,1,1);
  tru:=z;
end;
//nhan
function nhan(s1,s2:ansistring):ansistring;
var n,i,g,f,e,nho,h:LongInt;
    z,s,r:ansistring;
begin g:=length(s1);z:='0';
  while g>=1 do
  begin s:='';nho:=0;
    val(s1[g],e);
    for i:=length(s2) downto 1 do
    begin
      val(s2[i],f);
      h:=f*e+nho;
      s:=chr((h mod 10)+48)+s;
      nho:=h div 10;
      end;
    str(nho,r);
    if nho>0 then s:=r+s;
    for i:=g to length(s1)-1 do s:=s+'0';
    z:=cong(z,s); dec(g);
    end;
  exit(z);
end;
//chia lay phan nguyen
function chia(sbc,sc:ansistring):ansistring;
var i,n,j:longint;
    z,r:ansistring;
begin r:='';z:='1';r:=sc;
  for i:=1 to length(sbc)-length(sc)-1 do z:=z+'0';
  if z='1' then z:='0' else sc:=nhan(sc,z);
  //for i:=1 to length(sbc) do r:=r+'0';
  while tru(sbc,sc)<>'0' do
  begin
    sc:=cong(sc,r);
    z:=cong(z,'1'); writeln(sc);
    end;
  chia:=z;
end;
BEGIN

END.
@trà nguyễn hữu nghĩa @ka1412 @son_gohan @Nguyễn Khoa
 

Bùi Thành Công

Học sinh
Thành viên
23 Tháng bảy 2018
87
58
31
20
Nam Định
Thcs Giao Thủy
sau vài lần chạy lại, mình phát hiện ra một số lỗi, các bạn sửa lại cho mình hàm trừ và hàm chia thành thế này nhé:
Mã:
//tru
function tru(sl,sb:ansistring):ansistring;
var n1,n2,i,g,d,du:LongInt;
    z:ansistring;
    code:Integer;
begin  z:='';
  if length(sl)<length(sb) then exit('0');sl:='0'+sl;sb:='0'+sb;
  if (length(sl)=length(sb)) then begin
  for i:=1 to length(sl) do if (ord(sl[i])<ord(sb[i]))and(ord(sl[i-1])<=ord(sb[i-1]))then exit('0');
  end;
  while length(sb)<Length(sl) do sb:='0'+sb;
  g:=Length(sl);du:=0;
  for i:=g downto 1 do
  begin
    Val(sl[i],n1,code);
    Val(sb[i],n2,code);
    if n1<n2+du then
    begin d:=n1+10-n2-du;du:=1; end
    else begin d:=n1-n2-du;du:=0; end;
    z:=Chr(d+48)+z;
    end;
  if z[1]='0'then delete(z,1,1);
  tru:=z;
end;
Mã:
unction chia(sbc,sc:ansistring):ansistring;
var i,n,j:longint;
    z,r:ansistring;
begin r:='';z:='1';r:=sc;
  while length(sc)<length(sbc) do begin z:=z+'0';sc:=sc+'0';end;
  if z='1' then z:='0';
  if tru(sbc,sc)='0' then
  begin delete(sc,length(sc),1);delete(z,length(z),1); end;
  while tru(sbc,sc)<>'0' do
  begin
    z:=cong(z,'1');
    sc:=cong(sc,r);
    end; z:=tru(z,'1');
  chia:=z;
end;
 

trà nguyễn hữu nghĩa

Cựu Mod Vật Lí |Cây bút Thơ|Thần tượng VH
Thành viên
14 Tháng năm 2017
3,974
7,627
744
22
Phú Yên
Trường THPT Lương Văn Chánh
sau vài lần chạy lại, mình phát hiện ra một số lỗi, các bạn sửa lại cho mình hàm trừ và hàm chia thành thế này nhé:
Mã:
//tru
function tru(sl,sb:ansistring):ansistring;
var n1,n2,i,g,d,du:LongInt;
    z:ansistring;
    code:Integer;
begin  z:='';
  if length(sl)<length(sb) then exit('0');sl:='0'+sl;sb:='0'+sb;
  if (length(sl)=length(sb)) then begin
  for i:=1 to length(sl) do if (ord(sl[i])<ord(sb[i]))and(ord(sl[i-1])<=ord(sb[i-1]))then exit('0');
  end;
  while length(sb)<Length(sl) do sb:='0'+sb;
  g:=Length(sl);du:=0;
  for i:=g downto 1 do
  begin
    Val(sl[i],n1,code);
    Val(sb[i],n2,code);
    if n1<n2+du then
    begin d:=n1+10-n2-du;du:=1; end
    else begin d:=n1-n2-du;du:=0; end;
    z:=Chr(d+48)+z;
    end;
  if z[1]='0'then delete(z,1,1);
  tru:=z;
end;
Mã:
unction chia(sbc,sc:ansistring):ansistring;
var i,n,j:longint;
    z,r:ansistring;
begin r:='';z:='1';r:=sc;
  while length(sc)<length(sbc) do begin z:=z+'0';sc:=sc+'0';end;
  if z='1' then z:='0';
  if tru(sbc,sc)='0' then
  begin delete(sc,length(sc),1);delete(z,length(z),1); end;
  while tru(sbc,sc)<>'0' do
  begin
    z:=cong(z,'1');
    sc:=cong(sc,r);
    end; z:=tru(z,'1');
  chia:=z;
end;
đăng code đầy đủ lên đê bạn ơi :D
 

Bùi Thành Công

Học sinh
Thành viên
23 Tháng bảy 2018
87
58
31
20
Nam Định
Thcs Giao Thủy
bài trên có chưa hoàn chỉnh nên bạn đăng code đầy đủ luôn đi
code hoàn chỉnh đây, @trà nguyễn hữu nghĩa xem giúp mình có gì sai ko.:D
Mã:
Program cong_tru_nhan_chia;
uses crt;
var n,i:LongInt;
    z,s:ansistring;
//cong
function cong(s2,s1:ansistring):ansistring;
var z:ansistring;
    n1,n2,i,g,d,du:LongInt;
    code:Integer;
begin z:='';
  while Length(s2)>Length(s1) do s1:='0'+s1;
  while Length(s1)>Length(s2) do s2:='0'+s2;
  s1:='0'+s1;s2:='0'+s2;g:=Length(s2);du:=0;
  for i:=g downto 1 do
  begin
    Val(s1[i],n1,code);
    Val(s2[i],n2,code);
    d:=n1+n2+du;
    if d>=10 then du:=1 else du:=0;
    d:=d MOD 10;
    z:=Chr(d+48)+z;
    end;
  if z[1]='0' then delete(z,1,1);
  cong:=z;
end;
//tru
function tru(sl,sb:ansistring):ansistring;
var n1,n2,i,g,d,du:LongInt;
    z:ansistring;
    code:Integer;
begin  z:='';
  if length(sl)<length(sb) then exit('0');sl:='0'+sl;sb:='0'+sb;
  if (length(sl)=length(sb)) then begin
  for i:=1 to length(sl) do if (ord(sl[i])<ord(sb[i]))and(ord(sl[i-1])<=ord(sb[i-1]))then exit('0');
  end;
  while length(sb)<Length(sl) do sb:='0'+sb;
  g:=Length(sl);du:=0;
  for i:=g downto 1 do
  begin
    Val(sl[i],n1,code);
    Val(sb[i],n2,code);
    if n1<n2+du then
    begin d:=n1+10-n2-du;du:=1; end
    else begin d:=n1-n2-du;du:=0; end;
    z:=Chr(d+48)+z;
    end;
  if z[1]='0'then delete(z,1,1);
  tru:=z;
end;
//nhan
function nhan(s1,s2:ansistring):ansistring;
var n,i,g,f,e,nho,h:LongInt;
    z,s,r:ansistring;
begin g:=length(s1);z:='0';
  while g>=1 do
  begin s:='';nho:=0;
    val(s1[g],e);
    for i:=length(s2) downto 1 do
    begin
      val(s2[i],f);
      h:=f*e+nho;
      s:=chr((h mod 10)+48)+s;
      nho:=h div 10;
      end;
    str(nho,r);
    if nho>0 then s:=r+s;
    for i:=g to length(s1)-1 do s:=s+'0';
    z:=cong(z,s); dec(g);
    end;
  exit(z);
end;
//chia lay phan nguyen
function chia(sbc,sc:ansistring):ansistring;
var i,n,j:longint;
    z,r:ansistring;
begin r:='';z:='1';r:=sc;
  while length(sc)<length(sbc) do begin z:=z+'0';sc:=sc+'0';end;
  if z='1' then z:='0';
  if tru(sbc,sc)='0' then
  begin delete(sc,length(sc),1);delete(z,length(z),1); end;
  while tru(sbc,sc)<>'0' do
  begin
    z:=cong(z,'1');
    sc:=cong(sc,r);
    end; z:=tru(z,'1');
  chia:=z;
end;
BEGIN  clrscr;
  writeln(chia('120','4')
 

trà nguyễn hữu nghĩa

Cựu Mod Vật Lí |Cây bút Thơ|Thần tượng VH
Thành viên
14 Tháng năm 2017
3,974
7,627
744
22
Phú Yên
Trường THPT Lương Văn Chánh
code hoàn chỉnh đây, @trà nguyễn hữu nghĩa xem giúp mình có gì sai ko.:D
Mã:
Program cong_tru_nhan_chia;
uses crt;
var n,i:LongInt;
    z,s:ansistring;
//cong
function cong(s2,s1:ansistring):ansistring;
var z:ansistring;
    n1,n2,i,g,d,du:LongInt;
    code:Integer;
begin z:='';
  while Length(s2)>Length(s1) do s1:='0'+s1;
  while Length(s1)>Length(s2) do s2:='0'+s2;
  s1:='0'+s1;s2:='0'+s2;g:=Length(s2);du:=0;
  for i:=g downto 1 do
  begin
    Val(s1[i],n1,code);
    Val(s2[i],n2,code);
    d:=n1+n2+du;
    if d>=10 then du:=1 else du:=0;
    d:=d MOD 10;
    z:=Chr(d+48)+z;
    end;
  if z[1]='0' then delete(z,1,1);
  cong:=z;
end;
//tru
function tru(sl,sb:ansistring):ansistring;
var n1,n2,i,g,d,du:LongInt;
    z:ansistring;
    code:Integer;
begin  z:='';
  if length(sl)<length(sb) then exit('0');sl:='0'+sl;sb:='0'+sb;
  if (length(sl)=length(sb)) then begin
  for i:=1 to length(sl) do if (ord(sl[i])<ord(sb[i]))and(ord(sl[i-1])<=ord(sb[i-1]))then exit('0');
  end;
  while length(sb)<Length(sl) do sb:='0'+sb;
  g:=Length(sl);du:=0;
  for i:=g downto 1 do
  begin
    Val(sl[i],n1,code);
    Val(sb[i],n2,code);
    if n1<n2+du then
    begin d:=n1+10-n2-du;du:=1; end
    else begin d:=n1-n2-du;du:=0; end;
    z:=Chr(d+48)+z;
    end;
  if z[1]='0'then delete(z,1,1);
  tru:=z;
end;
//nhan
function nhan(s1,s2:ansistring):ansistring;
var n,i,g,f,e,nho,h:LongInt;
    z,s,r:ansistring;
begin g:=length(s1);z:='0';
  while g>=1 do
  begin s:='';nho:=0;
    val(s1[g],e);
    for i:=length(s2) downto 1 do
    begin
      val(s2[i],f);
      h:=f*e+nho;
      s:=chr((h mod 10)+48)+s;
      nho:=h div 10;
      end;
    str(nho,r);
    if nho>0 then s:=r+s;
    for i:=g to length(s1)-1 do s:=s+'0';
    z:=cong(z,s); dec(g);
    end;
  exit(z);
end;
//chia lay phan nguyen
function chia(sbc,sc:ansistring):ansistring;
var i,n,j:longint;
    z,r:ansistring;
begin r:='';z:='1';r:=sc;
  while length(sc)<length(sbc) do begin z:=z+'0';sc:=sc+'0';end;
  if z='1' then z:='0';
  if tru(sbc,sc)='0' then
  begin delete(sc,length(sc),1);delete(z,length(z),1); end;
  while tru(sbc,sc)<>'0' do
  begin
    z:=cong(z,'1');
    sc:=cong(sc,r);
    end; z:=tru(z,'1');
  chia:=z;
end;
BEGIN  clrscr;
  writeln(chia('120','4')
code thiếu phần END. nha
 
  • Like
Reactions: Bùi Thành Công

trà nguyễn hữu nghĩa

Cựu Mod Vật Lí |Cây bút Thơ|Thần tượng VH
Thành viên
14 Tháng năm 2017
3,974
7,627
744
22
Phú Yên
Trường THPT Lương Văn Chánh
Nhận xét tí: Phép chia có vấn đề, số lớn thì nó chậm, không những vậy, test lại số nhỏ nó lại sai.
Bạn test bộ chia 120120 vs 4 xem sao.
 
  • Like
Reactions: Bùi Thành Công

Bùi Thành Công

Học sinh
Thành viên
23 Tháng bảy 2018
87
58
31
20
Nam Định
Thcs Giao Thủy

trà nguyễn hữu nghĩa

Cựu Mod Vật Lí |Cây bút Thơ|Thần tượng VH
Thành viên
14 Tháng năm 2017
3,974
7,627
744
22
Phú Yên
Trường THPT Lương Văn Chánh
Cái này phép trừ cũng lỗi nốt bạn ơi.
Hèn gì mình viết mãi vẫn không được phép chia
 

trà nguyễn hữu nghĩa

Cựu Mod Vật Lí |Cây bút Thơ|Thần tượng VH
Thành viên
14 Tháng năm 2017
3,974
7,627
744
22
Phú Yên
Trường THPT Lương Văn Chánh
Code phép trừ của bạn nó lỗi vài cái nên mình không dùng làm phép chia được, vì thế mình phải sửa lại:
+ Lỗi nhập 00 - 4 thì nó tưởng là 1000 - 4
+ Lỗi nhập 15631 - 12345 nó cho kq = 0.
Và đây là Code mình đã sửa phép trừ vs phép chia. 2 phép kia có lẽ là ổn r.
Mã:
Program cong_tru_nhan_chia;
uses crt;
var n,i:LongInt;
    z,s:ansistring;
//cong
function cong(s2,s1:ansistring):ansistring;
var z:ansistring;
    n1,n2,i,g,d,du:LongInt;
    code:Integer;
begin z:='';
  while Length(s2)>Length(s1) do s1:='0'+s1;
  while Length(s1)>Length(s2) do s2:='0'+s2;
  s1:='0'+s1;s2:='0'+s2;g:=Length(s2);du:=0;
  for i:=g downto 1 do
  begin
    Val(s1[i],n1,code);
    Val(s2[i],n2,code);
    d:=n1+n2+du;
    if d>=10 then du:=1 else du:=0;
    d:=d MOD 10;
    z:=Chr(d+48)+z;
    end;
  if z[1]='0' then delete(z,1,1);
  cong:=z;
end;
//tru
function tru(sl,sb:ansistring):ansistring;
var n1,n2,i,g,d,du:LongInt;
    z:ansistring;
    code:Integer;
begin  z:='';
  while (sl[1] = '0') and (length(sl) > 1) do Delete(sl,1,1);
  while (sb[1] = '0') and (Length(sb) > 1) do Delete(sb,1,1);
  if sb = '' then sb := '0';
  if length(sl) < length(sb) then exit('0');
  sl:='0'+sl;sb:='0'+sb;
  if (length(sl) = length(sb)) then begin
  for i:=1 to length(sl) do if (ord(sl[i])<ord(sb[i])) then exit('0')
  else if (ord(sl[i]) > ord(sb[i])) then break;
  end;
  while length(sb) < Length(sl) do sb:='0'+sb;
  g:=Length(sl);du:=0;
  for i:=g downto 1 do
  begin
    Val(sl[i],n1,code);
    Val(sb[i],n2,code);
    if n1<n2 + du then
    begin d:=n1+10-n2-du;du:=1; end
    else begin d:=n1-n2-du;du:=0; end;
    z:=Chr(d+48)+z;
    end;
  while (z[1]='0') and (length(z) > 1) do delete(z,1,1);
  tru:=z;
end;
//nhan
function nhan(s1,s2:string):string;
var n,i,g,f,e,nho,h:LongInt;
    z,s,r:string;
begin g:=length(s1);z:='0';
  while g>=1 do
  begin s:='';nho:=0;
    val(s1[g],e);
    for i:=length(s2) downto 1 do
    begin
      val(s2[i],f);
      h:=f*e+nho;
      s:=chr((h mod 10)+48)+s;
      nho:=h div 10;
      end;
    str(nho,r);
    if nho>0 then s:=r+s;
    for i:=g to length(s1)-1 do s:=s+'0';
    z:=cong(z,s); dec(g);
    end;
  exit(z);
end;
//chia lay phan nguyen
function chia(a,b:string):string;
var thuong,sj,sbc: string;
    i,j: integer;
begin
     thuong := '0';
     i := 1;
     sbc := a[i];
     while tru(sbc,b) = '0' do
     begin
     inc(i);
     sbc := sbc + a[i];
     end;
     while i <= length(a) do
     begin
          j := 1;
          str(j,sj);
          while tru(sbc,nhan(sj,b)) <> '0' do
          begin
                inc(j);
                str(j,sj);
          end;
          sj := tru(sj,'1');
          thuong := thuong + sj;
          sbc := tru(sbc,nhan(sj,b));
          inc(i);
          sbc := sbc + a[i];
     end;
     while (thuong[1] = '0') and (Length(thuong) > 1) do Delete(thuong,1,1);
     chia := thuong;
end;

BEGIN  clrscr;
 writeln(chia('6874548641651654656554645646','313515415456454'));
  readln;
END.
 
  • Like
Reactions: Bùi Thành Công

Bùi Thành Công

Học sinh
Thành viên
23 Tháng bảy 2018
87
58
31
20
Nam Định
Thcs Giao Thủy
Code phép trừ của bạn nó lỗi vài cái nên mình không dùng làm phép chia được, vì thế mình phải sửa lại:
+ Lỗi nhập 00 - 4 thì nó tưởng là 1000 - 4
+ Lỗi nhập 15631 - 12345 nó cho kq = 0.
Và đây là Code mình đã sửa phép trừ vs phép chia. 2 phép kia có lẽ là ổn r.
Mã:
Program cong_tru_nhan_chia;
uses crt;
var n,i:LongInt;
    z,s:ansistring;
//cong
function cong(s2,s1:ansistring):ansistring;
var z:ansistring;
    n1,n2,i,g,d,du:LongInt;
    code:Integer;
begin z:='';
  while Length(s2)>Length(s1) do s1:='0'+s1;
  while Length(s1)>Length(s2) do s2:='0'+s2;
  s1:='0'+s1;s2:='0'+s2;g:=Length(s2);du:=0;
  for i:=g downto 1 do
  begin
    Val(s1[i],n1,code);
    Val(s2[i],n2,code);
    d:=n1+n2+du;
    if d>=10 then du:=1 else du:=0;
    d:=d MOD 10;
    z:=Chr(d+48)+z;
    end;
  if z[1]='0' then delete(z,1,1);
  cong:=z;
end;
//tru
function tru(sl,sb:ansistring):ansistring;
var n1,n2,i,g,d,du:LongInt;
    z:ansistring;
    code:Integer;
begin  z:='';
  while (sl[1] = '0') and (length(sl) > 1) do Delete(sl,1,1);
  while (sb[1] = '0') and (Length(sb) > 1) do Delete(sb,1,1);
  if sb = '' then sb := '0';
  if length(sl) < length(sb) then exit('0');
  sl:='0'+sl;sb:='0'+sb;
  if (length(sl) = length(sb)) then begin
  for i:=1 to length(sl) do if (ord(sl[i])<ord(sb[i])) then exit('0')
  else if (ord(sl[i]) > ord(sb[i])) then break;
  end;
  while length(sb) < Length(sl) do sb:='0'+sb;
  g:=Length(sl);du:=0;
  for i:=g downto 1 do
  begin
    Val(sl[i],n1,code);
    Val(sb[i],n2,code);
    if n1<n2 + du then
    begin d:=n1+10-n2-du;du:=1; end
    else begin d:=n1-n2-du;du:=0; end;
    z:=Chr(d+48)+z;
    end;
  while (z[1]='0') and (length(z) > 1) do delete(z,1,1);
  tru:=z;
end;
//nhan
function nhan(s1,s2:string):string;
var n,i,g,f,e,nho,h:LongInt;
    z,s,r:string;
begin g:=length(s1);z:='0';
  while g>=1 do
  begin s:='';nho:=0;
    val(s1[g],e);
    for i:=length(s2) downto 1 do
    begin
      val(s2[i],f);
      h:=f*e+nho;
      s:=chr((h mod 10)+48)+s;
      nho:=h div 10;
      end;
    str(nho,r);
    if nho>0 then s:=r+s;
    for i:=g to length(s1)-1 do s:=s+'0';
    z:=cong(z,s); dec(g);
    end;
  exit(z);
end;
//chia lay phan nguyen
function chia(a,b:string):string;
var thuong,sj,sbc: string;
    i,j: integer;
begin
     thuong := '0';
     i := 1;
     sbc := a[i];
     while tru(sbc,b) = '0' do
     begin
     inc(i);
     sbc := sbc + a[i];
     end;
     while i <= length(a) do
     begin
          j := 1;
          str(j,sj);
          while tru(sbc,nhan(sj,b)) <> '0' do
          begin
                inc(j);
                str(j,sj);
          end;
          sj := tru(sj,'1');
          thuong := thuong + sj;
          sbc := tru(sbc,nhan(sj,b));
          inc(i);
          sbc := sbc + a[i];
     end;
     while (thuong[1] = '0') and (Length(thuong) > 1) do Delete(thuong,1,1);
     chia := thuong;
end;

BEGIN  clrscr;
 writeln(chia('6874548641651654656554645646','313515415456454'));
  readln;
END.
bạn ơi, lấy 100 chia cho 4 nó ra 24 bạn ạ.
 

trà nguyễn hữu nghĩa

Cựu Mod Vật Lí |Cây bút Thơ|Thần tượng VH
Thành viên
14 Tháng năm 2017
3,974
7,627
744
22
Phú Yên
Trường THPT Lương Văn Chánh
bạn ơi, lấy 100 chia cho 4 nó ra 24 bạn ạ.
Mã:
//chia lay phan nguyen
function chia(a,b:string):string;
var thuong,sj,sbc: string;
    i,j: integer;
begin
     thuong := '0';
     i := 1;
     sbc := a[i];
     while tru(sbc,b) = '0' do
     begin
     inc(i);
     sbc := sbc + a[i];
     end;
     while i <= length(a) do
     begin
          j := 1;
          str(j,sj);
          while tru(sbc,nhan(sj,b)) <> '0' do
          begin
                inc(j);
                str(j,sj);
          end;
          if (sbc <> nhan(sj,b)) then 
          sj := tru(sj,'1');
          thuong := thuong + sj;
          sbc := tru(sbc,nhan(sj,b));
          inc(i);
          sbc := sbc + a[i];
     end;
     while (thuong[1] = '0') and (Length(thuong) > 1) do Delete(thuong,1,1);
     chia := thuong;
end;
Bạn nói mình mới để ý, mình quên xét trường hợp nó chia hết nên mới bị vậy
Đã sửa (thêm vào một câu lệnh điều kiện là được)
 
  • Like
Reactions: Bùi Thành Công

Bùi Thành Công

Học sinh
Thành viên
23 Tháng bảy 2018
87
58
31
20
Nam Định
Thcs Giao Thủy
Mã:
//chia lay phan nguyen
function chia(a,b:string):string;
var thuong,sj,sbc: string;
    i,j: integer;
begin
     thuong := '0';
     i := 1;
     sbc := a[i];
     while tru(sbc,b) = '0' do
     begin
     inc(i);
     sbc := sbc + a[i];
     end;
     while i <= length(a) do
     begin
          j := 1;
          str(j,sj);
          while tru(sbc,nhan(sj,b)) <> '0' do
          begin
                inc(j);
                str(j,sj);
          end;
          if (sbc <> nhan(sj,b)) then
          sj := tru(sj,'1');
          thuong := thuong + sj;
          sbc := tru(sbc,nhan(sj,b));
          inc(i);
          sbc := sbc + a[i];
     end;
     while (thuong[1] = '0') and (Length(thuong) > 1) do Delete(thuong,1,1);
     chia := thuong;
end;
Bạn nói mình mới để ý, mình quên xét trường hợp nó chia hết nên mới bị vậy
Đã sửa (thêm vào một câu lệnh điều kiện là được)
mình cũng đã sửa lại hàm trừ rồi làm lại hàm chia theo cách của mình, bạn xem đúng chưa:
Mã:
Program cong_tru_nhan_chia;
uses crt;
var n,i:LongInt;
    z,s:ansistring;
//cong
function cong(s2,s1:ansistring):ansistring;
var z:ansistring;
    n1,n2,i,g,d,du:LongInt;
    code:Integer;
begin z:='';
  while Length(s2)>Length(s1) do s1:='0'+s1;
  while Length(s1)>Length(s2) do s2:='0'+s2;
  s1:='0'+s1;s2:='0'+s2;g:=Length(s2);du:=0;
  for i:=g downto 1 do
  begin
    Val(s1[i],n1,code);
    Val(s2[i],n2,code);
    d:=n1+n2+du;
    if d>=10 then du:=1 else du:=0;
    d:=d MOD 10;
    z:=Chr(d+48)+z;
    end;
  if z[1]='0' then delete(z,1,1);
  cong:=z;
end;
//tru
function tru(sl,sb:ansistring):ansistring;
var n1,n2,i,g,d,du:LongInt;
    z:ansistring;
    code:Integer;
begin  z:='';
  while (sl[1] = '0') and (length(sl) > 1) do Delete(sl,1,1);
  while (sb[1] = '0') and (Length(sb) > 1) do Delete(sb,1,1);
  if sb = '' then sb := '0';
  if length(sl) < length(sb) then exit('0');
  sl:='0'+sl;sb:='0'+sb;
  if (length(sl) = length(sb)) then begin
  for i:=1 to length(sl) do if (ord(sl[i])<ord(sb[i])) then exit('0')
  else if (ord(sl[i]) > ord(sb[i])) then break;
  end;
  while length(sb) < Length(sl) do sb:='0'+sb;
  g:=Length(sl);du:=0;
  for i:=g downto 1 do
  begin
    Val(sl[i],n1,code);
    Val(sb[i],n2,code);
    if n1<n2 + du then
    begin d:=n1+10-n2-du;du:=1; end
    else begin d:=n1-n2-du;du:=0; end;
    z:=Chr(d+48)+z;
    end;
  while (z[1]='0') and (length(z) > 1) do delete(z,1,1);
  tru:=z;
end;
//nhan
function nhan(s1,s2:ansistring):ansistring;
var n,i,g,f,e,nho,h:LongInt;
    z,s,r:ansistring;
begin g:=length(s1);z:='0';
  while g>=1 do
  begin s:='';nho:=0;
    val(s1[g],e);
    for i:=length(s2) downto 1 do
    begin
      val(s2[i],f);
      h:=f*e+nho;
      s:=chr((h mod 10)+48)+s;
      nho:=h div 10;
      end;
    str(nho,r);
    if nho>0 then s:=r+s;
    for i:=g to length(s1)-1 do s:=s+'0';
    z:=cong(z,s); dec(g);
    end;
  exit(z);
end;
//chia lay phan nguyen
function chia(sbc,sc:ansistring):ansistring;
var thuong,r,g:ansistring;
    i,n,j: longint;
begin  thuong:='1';r:=sc;
  if tru(sbc,sc+'0')<>'0' then
  while length(sbc)>length(sc) do begin sc:=sc+'0';thuong:=thuong+'0';end;
  if tru(sbc,sc)='0' then begin
  delete(thuong,length(thuong),1);
  delete(sc,length(sc),1);
  end;
  while tru(sbc,sc)<>'0' do
  begin
    sc:=cong(sc,r);
    thuong:=cong(thuong,'1');
    end;
  if sc>sbc then thuong:=tru(thuong,'1');
  chia:=thuong;
end;
BEGIN  clrscr;
  writeln(chia('10067','4'));
  readln;
END.
 

trà nguyễn hữu nghĩa

Cựu Mod Vật Lí |Cây bút Thơ|Thần tượng VH
Thành viên
14 Tháng năm 2017
3,974
7,627
744
22
Phú Yên
Trường THPT Lương Văn Chánh
mình cũng đã sửa lại hàm trừ rồi làm lại hàm chia theo cách của mình, bạn xem đúng chưa:
Mã:
Program cong_tru_nhan_chia;
uses crt;
var n,i:LongInt;
    z,s:ansistring;
//cong
function cong(s2,s1:ansistring):ansistring;
var z:ansistring;
    n1,n2,i,g,d,du:LongInt;
    code:Integer;
begin z:='';
  while Length(s2)>Length(s1) do s1:='0'+s1;
  while Length(s1)>Length(s2) do s2:='0'+s2;
  s1:='0'+s1;s2:='0'+s2;g:=Length(s2);du:=0;
  for i:=g downto 1 do
  begin
    Val(s1[i],n1,code);
    Val(s2[i],n2,code);
    d:=n1+n2+du;
    if d>=10 then du:=1 else du:=0;
    d:=d MOD 10;
    z:=Chr(d+48)+z;
    end;
  if z[1]='0' then delete(z,1,1);
  cong:=z;
end;
//tru
function tru(sl,sb:ansistring):ansistring;
var n1,n2,i,g,d,du:LongInt;
    z:ansistring;
    code:Integer;
begin  z:='';
  while (sl[1] = '0') and (length(sl) > 1) do Delete(sl,1,1);
  while (sb[1] = '0') and (Length(sb) > 1) do Delete(sb,1,1);
  if sb = '' then sb := '0';
  if length(sl) < length(sb) then exit('0');
  sl:='0'+sl;sb:='0'+sb;
  if (length(sl) = length(sb)) then begin
  for i:=1 to length(sl) do if (ord(sl[i])<ord(sb[i])) then exit('0')
  else if (ord(sl[i]) > ord(sb[i])) then break;
  end;
  while length(sb) < Length(sl) do sb:='0'+sb;
  g:=Length(sl);du:=0;
  for i:=g downto 1 do
  begin
    Val(sl[i],n1,code);
    Val(sb[i],n2,code);
    if n1<n2 + du then
    begin d:=n1+10-n2-du;du:=1; end
    else begin d:=n1-n2-du;du:=0; end;
    z:=Chr(d+48)+z;
    end;
  while (z[1]='0') and (length(z) > 1) do delete(z,1,1);
  tru:=z;
end;
//nhan
function nhan(s1,s2:ansistring):ansistring;
var n,i,g,f,e,nho,h:LongInt;
    z,s,r:ansistring;
begin g:=length(s1);z:='0';
  while g>=1 do
  begin s:='';nho:=0;
    val(s1[g],e);
    for i:=length(s2) downto 1 do
    begin
      val(s2[i],f);
      h:=f*e+nho;
      s:=chr((h mod 10)+48)+s;
      nho:=h div 10;
      end;
    str(nho,r);
    if nho>0 then s:=r+s;
    for i:=g to length(s1)-1 do s:=s+'0';
    z:=cong(z,s); dec(g);
    end;
  exit(z);
end;
//chia lay phan nguyen
function chia(sbc,sc:ansistring):ansistring;
var thuong,r,g:ansistring;
    i,n,j: longint;
begin  thuong:='1';r:=sc;
  if tru(sbc,sc+'0')<>'0' then
  while length(sbc)>length(sc) do begin sc:=sc+'0';thuong:=thuong+'0';end;
  if tru(sbc,sc)='0' then begin
  delete(thuong,length(thuong),1);
  delete(sc,length(sc),1);
  end;
  while tru(sbc,sc)<>'0' do
  begin
    sc:=cong(sc,r);
    thuong:=cong(thuong,'1');
    end;
  if sc>sbc then thuong:=tru(thuong,'1');
  chia:=thuong;
end;
BEGIN  clrscr;
  writeln(chia('10067','4'));
  readln;
END.
giờ test lại mới thấy hàm chia của mình vs bạn đều lỗi.
Không tính được 4 chia 4
 

trà nguyễn hữu nghĩa

Cựu Mod Vật Lí |Cây bút Thơ|Thần tượng VH
Thành viên
14 Tháng năm 2017
3,974
7,627
744
22
Phú Yên
Trường THPT Lương Văn Chánh
  • Like
Reactions: Bùi Thành Công
Top Bottom