Hướng dẫn giải của Lát gạch
Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này
Code mẫu của flashmt
const base=1000000000; dg=9; type bignum=array[0..5] of longint; var n,i,t:longint; f:array[1..100] of bignum; procedure plus(var a,b,c:bignum); var i,mem:longint; begin a[0]:=b[0]; mem:=0; for i:=1 to a[0] do begin a[i]:=b[i]+c[i]+mem; if a[i]>=base then begin a[i]:=a[i]-base; mem:=1 end else mem:=0; end; if mem=1 then begin inc(a[0]); a[a[0]]:=mem; end; end; procedure wf(a:bignum); var i,j,l:longint; s:string; begin for i:=a[0] downto 1 do begin if i<a[0] then begin str(a[i],s); l:=length(s); for j:=l+1 to dg do write(0); end; write(a[i]); end; writeln; end; begin f[1,0]:=1; f[1,1]:=1; f[2,0]:=1; f[2,1]:=2; for i:=3 to 100 do plus(f[i],f[i-1],f[i-2]); read(t); for i:=1 to t do begin read(n); wf(f[n]); end; end.
Code mẫu của happyboy99x
#include <cstdio> #include <algorithm> using namespace std; #define L_MAX 1000 //length max #define RADIX 1000000000 #define N_MAX 100 + 2 #define REP(i, n) for( int i = 0, _n = (n); i < _n ; ++i ) #define REPD(i, n) for( int i = (n)-1; i >= 0; --i ) #define FOR(i, a, b) for( int i = (a), _b = (b); i <= _b; ++i ) int f[N_MAX][L_MAX]; int l[N_MAX]; int countNum; //----------------------------PROTOTYPE------------------------------- void init(); void calc(int, int); void plus(int *, int *, int *, int, int, int & ); void print( int *, int l ); //-------------------------------------------------------------------- void init() { f[0][0] = 0; l[0] = 1; f[1][0] = 1; l[1] = 1; countNum = 2; } void calc( int a, int b ) { countNum = b + 1; FOR(i, a, b) plus( f[i-1], f[i-2], f[i], l[i-1], l[i-2], l[i] ); } void print( int a[], int l ) { printf( "%d", a[l-1] ); REPD(i, l-1) printf( "%09d", a[i] ); } void plus( int a[], int b[], int c[], int la, int lb, int &lc ) { int carry = 0; lc = max(la, lb); REP(i, lc) { c[i] = a[i] + b[i] + carry; if ( c[i] >= RADIX ) { carry = 1; c[i] -= RADIX; } else carry = 0; } if (carry) c[lc++] = 1; } int main() { init(); int tc, n; scanf("%d",&tc); while ( tc-- && scanf( "%d", &n) == 1 ) { if ( n+1 >= countNum ) calc( countNum, n+1 ); print( f[n+1], l[n+1] ); printf( "\n" ); } return 0; }
Code mẫu của ladpro98
program latgach; uses math; type bignum=string[30]; const fi=''; var n,t,i:longint; f:array[1..100] of string[30]; inp:text; function cong(a,b:bignum):bignum; var c:bignum; x,y,sum,i,carry:longint; begin c:='';carry:=0; while length(a)<length(b) do a:='0'+a; while length(b)<length(a) do b:='0'+b; for i:=length(a) downto 1 do begin x:=ord(a[i])-48; y:=ord(b[i])-48; sum:=x+y+carry; carry:=sum div 10; c:=chr(sum mod 10 + 48) + c; end; if carry>0 then c:='1'+c; exit(c); end; begin assign(inp,fi); reset(inp); readln(inp,t); f[1]:='1'; f[2]:='2'; for i:=3 to 100 do f[i]:=cong(f[i-1],f[i-2]); for i:=1 to t do begin readln(inp,n); writeln(f[n]); end; close(inp); end.
Code mẫu của hieult
#include<stdio.h> #include<string.h> main() { int x,a[100],i,b[23],c[23],m; scanf("%d",&x); for(int j=0;j<x;j++) scanf("%d",&a[j]); for(int j=0;j<x;j++) { for(int k=0;k<=21;k++) { b[k]=0;c[k]=0; } b[22]=0; c[22]=1; i=0; while(1) { for(int t=22;t>=0;t--) { m=b[t]; b[t]=(b[t]+c[t])%10; if(b[t]<c[t]||m==10) b[t-1]++; } i++; if(i==a[j]) { int u=0; for(int t=0;t<=22;t++) { u+=b[t]; if(u==0) continue; printf("%d",b[t]%10); } printf("\n"); break; } for(int t=22;t>=0;t--) { m=c[t]; c[t]=(b[t]+c[t])%10; if(c[t]<b[t]||m==10) c[t-1]++; } i++; if(i==a[j]) { int u=0; for(int t=0;t<=22;t++) { u+=c[t]; if(u==0) continue; printf("%d",c[t]%10); } printf("\n"); break; } } } }
Code mẫu của ll931110
Program LATGACH; Const Input = ''; Output = ''; Var d,test: array[1..100] of byte; F: array[1..100,1..30] of byte; i,n: integer; Procedure enter; Var fi: text; i: integer; Begin Assign(fi, input); Reset(fi); Readln(fi, n); For i:= 1 to n do readln(fi, test[i]); Close(fi); Fillchar(F, sizeof(F), 0); End; Procedure calc; Var i,j: integer; Begin F[1,1]:= 1; d[1]:= 1; F[2,1]:= 2; d[2]:= 1; For i:= 3 to 100 do Begin For j:= 1 to d[i - 1] do Begin F[i,j]:= F[i,j] + F[i - 1,j] + F[i - 2,j]; If F[i,j] > 9 then Begin F[i,j + 1]:= 1; F[i,j]:= F[i,j] - 10; End; End; d[i]:= d[i - 1]; If F[i, d[i - 1] + 1] <> 0 then inc(d[i]); End; End; Procedure printresult; Var fo: text; i,j: integer; Begin Assign(fo, output); Rewrite(fo); For i:= 1 to n do Begin For j:= d[test[i]] downto 1 do write(fo, F[test[i],j]); Writeln(fo); End; Close(fo); End; Begin enter; calc; printresult; End.
Code mẫu của skyvn97
program latgach; uses crt; type bignum=string; const max=111; var opt:array[1..max] of bignum; t,c,n:integer; a,b:bignum; function bigplus(a,b:bignum):bignum; var i,carry,s:integer; result:bignum; begin result:=''; while length(a)<length(b) do a:='0'+a; while length(b)<length(a) do b:='0'+b; carry:=0; for i:=length(a) downto 1 do begin s:=ord(a[i])+ord(b[i])+carry-96; carry:=s div 10; result:=chr(s mod 10+48)+result; end; if carry=1 then result:='1'+result; bigplus:=result; end; procedure init; var i:integer; begin opt[1]:='1'; opt[2]:='2'; for i:=3 to max do opt[i]:=bigplus(opt[i-1],opt[i-2]); end; begin init; readln(t); for c:=1 to t do begin readln(n); writeln(opt[n]); end; end.
Code mẫu của khuc_tuan
import java.io.*; import java.util.*; import java.math.*; public class Main { public static void main(String[] args) { BigInteger[] f = new BigInteger[101]; f[0] = BigInteger.ONE; f[1] = BigInteger.ONE; for(int i=2;i<101;++i) f[i] = f[i-1].add(f[i-2]); Scanner sc = new Scanner(System.in); int t = sc.nextInt(); for(int i=0;i<t;++i) System.out.println(f[sc.nextInt()]); } }
Bình luận