有毛病的打印机(pascal)
的有关信息介绍如下:
这道题的关键在于寻找规律。n 总个数1 12 193 2714 34395 40951很容易发现19=1*9+10271=19*9+1003439=271*9+100040951=3439*9+10000假定10^(n-1)对应的结果为K,那么,对于10^n而言,所有数可分为10组,分别以0,1,2,...,9开头。其中9组,即0,1,2,3,4,5,6,7,9组,每组有k个不能正确打出。而8组共有10^(n-1)个无法打出。故可得递推公式f[n]:=f[n-1]*9+10^(n-1);由于N<=1000,因而需要使用高精度运算。附程序:Program Ex;Const Power:Array[0..3] Of Integer=(1,10,100,1000);Var n:Integer; a:Array[0..300] Of Longint;Procedure Init;Begin Readln(n); FillChar(a,SizeOf(a),0); a[0]:=1;a[1]:=1;End;Procedure Mul;Var i,j:Integer;Begin For i:=1 To a[0] Do a[i]:=a[i]*9; For i:=1 To a[0] Do If a[i]>10000 Then begin Inc(a[i+1],a[i] Div 10000); a[i]:=a[i] Mod 10000; end; If a[a[0]+1]<>0 Then Inc(a[0]);End;Procedure Main;Var i,x,y:Integer;Begin For i:=2 To n Do begin Mul; x:=(i-1) Div 4+1;y:=(i-1) Mod 4; Inc(a[x],Power[y]); While a[x]>10000 Do begin Inc(a[x+1],a[x] Div 10000); a[x]:=a[x] Mod 10000; Inc(x); end; If a[a[0]+1]<>0 Then Inc(a[0]); end;End;Procedure Print;Var i:Integer;Begin Write(a[a[0]]); For i:=a[0]-1 Downto 1 Do Case a[i] Of 0..9:Write('000',a[i]); 10..99:Write('00',a[i]); 100..999:Write('0',a[i]); 1000..9999:Write(a[i]); end; Writeln; Writeln(a[0]);End;Begin Init; Main; Print;End.



