Tin học Bài tập pascal

Bùi Thành Công

Học sinh
Thành viên
23 Tháng bảy 2018
87
58
31
19
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.

Bài 2. Giai thừa GIAITHUA.PAS
Tuấn và Minh mới học phép nhân có nhớ. Các em rất thích thú khi nhận ra rằng chỉ cần kiên trì là các em có thể thực hiện các phép nhân với số chữ số lớn tùy ý. Một ngày chủ nhật, hai em quyết định thi với nhau xem ai làm tính chính xác hơn. Các em đặt ra bài toán sau:
Chọn 1 số nguyên dương N, tính tích 1.2.3…N (kí hiệu là N!, đọc là N giai thừa) được một số, sau đó tính tổng tất các các chữ số của số này.
Kết quả tính toán của Tuấn và Minh khác nhau, vì vậy các em quyết định nhờ một anh học sinh giỏi lớp 9 xác định giúp xem ai đúng, ai sai.
Để có thể làm trọng tài cho Tuấn và Minh, em hãy lập chương trình giải quyết bài toán do Tuấn và Minh đặt ra.
Input: Dữ liệu vào cho trong file văn bản có tên GIAITHUA.INP bao gồm nhiều bộ dữ liệu. Mỗi bộ dữ liệu nằm trên 1 dòng chứa một số tự nhiên N duy nhất (1< N <2000).
Output: Kết quả đưa ra file văn bản có tên GIAITHUA.OUT. Kết quả của mỗi bộ dữ liệu vào nằm trên một dòng theo thứ tự trong file input và chỉ chứa 1 số nguyên duy nhất là tổng các chữ số của số nguyên N!
Ví dụ:

GIAITHUA.INP

GIAITHUA.OUT

2
4
6

2
6
9
[TBODY] [/TBODY]

ae giúp mình bài này với
 

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,619
744
21
Phú Yên
Trường THPT Lương Văn Chánh
Bài 2. Giai thừa GIAITHUA.PAS
Tuấn và Minh mới học phép nhân có nhớ. Các em rất thích thú khi nhận ra rằng chỉ cần kiên trì là các em có thể thực hiện các phép nhân với số chữ số lớn tùy ý. Một ngày chủ nhật, hai em quyết định thi với nhau xem ai làm tính chính xác hơn. Các em đặt ra bài toán sau:
Chọn 1 số nguyên dương N, tính tích 1.2.3…N (kí hiệu là N!, đọc là N giai thừa) được một số, sau đó tính tổng tất các các chữ số của số này.
Kết quả tính toán của Tuấn và Minh khác nhau, vì vậy các em quyết định nhờ một anh học sinh giỏi lớp 9 xác định giúp xem ai đúng, ai sai.
Để có thể làm trọng tài cho Tuấn và Minh, em hãy lập chương trình giải quyết bài toán do Tuấn và Minh đặt ra.
Input: Dữ liệu vào cho trong file văn bản có tên GIAITHUA.INP bao gồm nhiều bộ dữ liệu. Mỗi bộ dữ liệu nằm trên 1 dòng chứa một số tự nhiên N duy nhất (1< N <2000).
Output: Kết quả đưa ra file văn bản có tên GIAITHUA.OUT. Kết quả của mỗi bộ dữ liệu vào nằm trên một dòng theo thứ tự trong file input và chỉ chứa 1 số nguyên duy nhất là tổng các chữ số của số nguyên N!
Ví dụ:
GIAITHUA.INPGIAITHUA.OUT
2
4
6
2
6
9
[TBODY] [/TBODY]
ae giúp mình bài này với
Vì 1 < 2000 < N nên không có kiểu dữ liệu nào có thể tính được giai thừa lớn như vậy, vì vậy chắc chắn dùng kiểu string rồi.
Sẽ tính giai thừa trên kiểu string, sau đó cộng lại cũng trên kiểu string luôn.
Bạn viết thử xem được không nha.
Hơi bận nên mình cũng không có thời gian viết thử
 

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,619
744
21
Phú Yên
Trường THPT Lương Văn Chánh
và đây là tất cả những gì mình có:
(Chạy trên TP muốn nát máy nhưng trên FP rất nhanh nên code coi như ổn)
Mã:
 Program TongGiaiThua;
 uses crt;

 Function Tong(a,b: string): string;
 var c,i,ia,ib,tng,so,nho: integer;
     sc,sso,t,snho: string;
 Begin
      t := '';
      if Length(b) > Length(a) then
      begin
           sc := b;
           b := a;
           a := sc;
      end;
      for i := 1 to Length(a) - Length(b) do
      b := '0' + b;
      nho := 0;
      for i := Length(a) downto 1 do
      begin
           Val(a[i],ia,c);
           Val(b[i],ib,c);
           Tng := ia + ib + nho;
           so := tng mod 10;
           nho := tng div 10;
           Str(so,sso);
           Str(nho,snho);
           t := sso + t;
      end;
      if (nho > 0) then t := snho + t;
      tong := t;
 End;

 Function Tich(a,b: string): string;
 var i,j,k,so,nho,ia,ib,c,tch: integer;
     sso,tich1,t,snho: string;
 Begin
      t := '0';
      for i := Length(a) downto 1 do
      begin
           nho := 0;
           tich1 := '';
           for j := Length(b) downto 1 do
           begin
                Val(a[i],ia,c);
                Val(b[j],ib,c);
                tch := ia*ib + nho;
                so := tch mod 10;
                nho := tch div 10;
                str(so,sso);
                str(nho,snho);
                tich1 := sso + tich1;
           end;
           if nho > 0 then tich1 := snho + tich1;
           for k := Length(a) downto i + 1 do
           tich1 := tich1 + '0';
           t := tong(t,tich1);
      end;
      tich := t;
 End;

 Function Giaithua(n: integer): string;
 var i:integer;
     gt,si: string;
 begin
      gt := '1';
      for i := 1 to n do
      begin
           str(i,si);
           gt := tich(si,gt);
      end;
      Giaithua := gt;
 end;

 Function Tonggt(n : integer): string;
 var i: integer;
     gt,tongg: string;
 Begin
      tongg := '0';
      gt := Giaithua(n);
      for i := 1 to Length(gt) do
      tongg := tong(tongg,gt[i]);
      tonggt := tongg;
 End;

 var n: integer;

 BEGIN
      clrscr;
      readln(n);
      Write(tonggt(n));
      readln;
 END.
 

Bùi Thành Công

Học sinh
Thành viên
23 Tháng bảy 2018
87
58
31
19
Nam Định
Thcs Giao Thủy
Mình đang viết thử nè, tổng thì được nhưng tích khó quá
mình viết đk rồi đây, đăng lên cho ae xem
Mã:
var fa,fd:text;
    n,i,j:longint;
    z,s:ansistring;
    a:array[1..100] of longint;
function nhan(s1,s2:ansistring):ansistring;
    Var   a,b,i,j,L1,L2,code:word;
          nhan1,s:ansistring;
          C  :Array[0..10000] of byte;
 Begin
      L1:=length(s1); L2:=length(s2);
            For i:=1 to l1+l2 do C[i]:=0;
        For i:=1 to L1 do For j:=1 to L2 do
 Begin
val(s1[i],A,code);
 val(s2[j],B,code);
 c[i+j]:=c[i+j]+a*b;
End;
For i:=L1+L2 downto 3 do
 Begin
 c[i-1]:=c[i-1] + c[i] Div 10;
 c[i]:=c[i] Mod 10;
 End; nhan1:='';
     For i:=2 to L1+L2 do begin str(c[i],s);nhan1:=nhan1+s; end;
     exit(nhan1);
End;

function tcs(s:ansistring):longint;
var i,n,d:longint;
begin
  n:=length(s); d:=0;
  for i:=1 to n do d:=d+ord(s[i])-ord('0');
  exit(d);
end;
BEGIN
  assign(fa,'giaithua.inp');reset(fa);
  assign(fd,'giaithua.out');rewrite(fd); j:=1;
  while not seekeof(fa) do
  begin
    readln(fa,n); z:='1';
    for i:=1 to n do begin str(i,s);z:=nhan(z,s); end;
    writeln(fd,tcs(z));  writeln(z);
    end;
  close(fa);close
 

Bùi Thành Công

Học sinh
Thành viên
23 Tháng bảy 2018
87
58
31
19
Nam Định
Thcs Giao Thủy
và đây là tất cả những gì mình có:
(Chạy trên TP muốn nát máy nhưng trên FP rất nhanh nên code coi như ổn)
Mã:
 Program TongGiaiThua;
 uses crt;

 Function Tong(a,b: string): string;
 var c,i,ia,ib,tng,so,nho: integer;
     sc,sso,t,snho: string;
 Begin
      t := '';
      if Length(b) > Length(a) then
      begin
           sc := b;
           b := a;
           a := sc;
      end;
      for i := 1 to Length(a) - Length(b) do
      b := '0' + b;
      nho := 0;
      for i := Length(a) downto 1 do
      begin
           Val(a[i],ia,c);
           Val(b[i],ib,c);
           Tng := ia + ib + nho;
           so := tng mod 10;
           nho := tng div 10;
           Str(so,sso);
           Str(nho,snho);
           t := sso + t;
      end;
      if (nho > 0) then t := snho + t;
      tong := t;
 End;

 Function Tich(a,b: string): string;
 var i,j,k,so,nho,ia,ib,c,tch: integer;
     sso,tich1,t,snho: string;
 Begin
      t := '0';
      for i := Length(a) downto 1 do
      begin
           nho := 0;
           tich1 := '';
           for j := Length(b) downto 1 do
           begin
                Val(a[i],ia,c);
                Val(b[j],ib,c);
                tch := ia*ib + nho;
                so := tch mod 10;
                nho := tch div 10;
                str(so,sso);
                str(nho,snho);
                tich1 := sso + tich1;
           end;
           if nho > 0 then tich1 := snho + tich1;
           for k := Length(a) downto i + 1 do
           tich1 := tich1 + '0';
           t := tong(t,tich1);
      end;
      tich := t;
 End;

 Function Giaithua(n: integer): string;
 var i:integer;
     gt,si: string;
 begin
      gt := '1';
      for i := 1 to n do
      begin
           str(i,si);
           gt := tich(si,gt);
      end;
      Giaithua := gt;
 end;

 Function Tonggt(n : integer): string;
 var i: integer;
     gt,tongg: string;
 Begin
      tongg := '0';
      gt := Giaithua(n);
      for i := 1 to Length(gt) do
      tongg := tong(tongg,gt[i]);
      tonggt := tongg;
 End;

 var n: integer;

 BEGIN
      clrscr;
      readln(n);
      Write(tonggt(n));
      readln;
 END.
cách của bạn có vẻ hay hơn đấ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,619
744
21
Phú Yên
Trường THPT Lương Văn Chánh
mình viết đk rồi đây, đăng lên cho ae xem
Mã:
var fa,fd:text;
    n,i,j:longint;
    z,s:ansistring;
    a:array[1..100] of longint;
function nhan(s1,s2:ansistring):ansistring;
    Var   a,b,i,j,L1,L2,code:word;
          nhan1,s:ansistring;
          C  :Array[0..10000] of byte;
 Begin
      L1:=length(s1); L2:=length(s2);
            For i:=1 to l1+l2 do C[i]:=0;
        For i:=1 to L1 do For j:=1 to L2 do
 Begin
val(s1[i],A,code);
 val(s2[j],B,code);
 c[i+j]:=c[i+j]+a*b;
End;
For i:=L1+L2 downto 3 do
 Begin
 c[i-1]:=c[i-1] + c[i] Div 10;
 c[i]:=c[i] Mod 10;
 End; nhan1:='';
     For i:=2 to L1+L2 do begin str(c[i],s);nhan1:=nhan1+s; end;
     exit(nhan1);
End;

function tcs(s:ansistring):longint;
var i,n,d:longint;
begin
  n:=length(s); d:=0;
  for i:=1 to n do d:=d+ord(s[i])-ord('0');
  exit(d);
end;
BEGIN
  assign(fa,'giaithua.inp');reset(fa);
  assign(fd,'giaithua.out');rewrite(fd); j:=1;
  while not seekeof(fa) do
  begin
    readln(fa,n); z:='1';
    for i:=1 to n do begin str(i,s);z:=nhan(z,s); end;
    writeln(fd,tcs(z));  writeln(z);
    end;
  close(fa);close
sao nó không xử lý được số n = 2000
 
  • Like
Reactions: Hồng Uyên 2k6

Bùi Thành Công

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

ka1412

Học sinh chăm học
Thành viên
24 Tháng mười một 2017
874
730
121
Hà Nội
CNN | Life
và đây là tất cả những gì mình có:
(Chạy trên TP muốn nát máy nhưng trên FP rất nhanh nên code coi như ổn)
Mã:
 Program TongGiaiThua;
 uses crt;

 Function Tong(a,b: string): string;
 var c,i,ia,ib,tng,so,nho: integer;
     sc,sso,t,snho: string;
 Begin
      t := '';
      if Length(b) > Length(a) then
      begin
           sc := b;
           b := a;
           a := sc;
      end;
      for i := 1 to Length(a) - Length(b) do
      b := '0' + b;
      nho := 0;
      for i := Length(a) downto 1 do
      begin
           Val(a[i],ia,c);
           Val(b[i],ib,c);
           Tng := ia + ib + nho;
           so := tng mod 10;
           nho := tng div 10;
           Str(so,sso);
           Str(nho,snho);
           t := sso + t;
      end;
      if (nho > 0) then t := snho + t;
      tong := t;
 End;

 Function Tich(a,b: string): string;
 var i,j,k,so,nho,ia,ib,c,tch: integer;
     sso,tich1,t,snho: string;
 Begin
      t := '0';
      for i := Length(a) downto 1 do
      begin
           nho := 0;
           tich1 := '';
           for j := Length(b) downto 1 do
           begin
                Val(a[i],ia,c);
                Val(b[j],ib,c);
                tch := ia*ib + nho;
                so := tch mod 10;
                nho := tch div 10;
                str(so,sso);
                str(nho,snho);
                tich1 := sso + tich1;
           end;
           if nho > 0 then tich1 := snho + tich1;
           for k := Length(a) downto i + 1 do
           tich1 := tich1 + '0';
           t := tong(t,tich1);
      end;
      tich := t;
 End;

 Function Giaithua(n: integer): string;
 var i:integer;
     gt,si: string;
 begin
      gt := '1';
      for i := 1 to n do
      begin
           str(i,si);
           gt := tich(si,gt);
      end;
      Giaithua := gt;
 end;

 Function Tonggt(n : integer): string;
 var i: integer;
     gt,tongg: string;
 Begin
      tongg := '0';
      gt := Giaithua(n);
      for i := 1 to Length(gt) do
      tongg := tong(tongg,gt[i]);
      tonggt := tongg;
 End;

 var n: integer;

 BEGIN
      clrscr;
      readln(n);
      Write(tonggt(n));
      readln;
 END.
Lâu không làm chả biết a đang viết cái gì :v
 
Top Bottom