算法习题及解答

发布时间 : 星期六 文章算法习题及解答更新完毕开始阅读

一个自然数可以写成若干个小于等于自己的自然之和,这叫该自然数的一个分解。不同的分解是表示这个自然数分解成的所有自然数不完全相同。例如:3=2+1和3=1+1+1表示不同的分解。而3=2+1和3=1+2为相同的分解。现在的任务是,给出一个自然数,要求所有不同的分解方案数。输入:输入文件的只有一个自然数N,N<=10000。(input.txt)输出:输出文件只有一个数,为N的分解方案数。(output.txt) var

n:integer; x: integer;

a:array [0..10000] of integer;

procedure writestr(); var

i:integer; begin

write(n,'=',a[1]); for i:=2 to x do begin

write('+',a[i]); end; writeln; end;

function adda():integer; var

s:integer; i:integer; begin

s:=0;

for i:=1 to x do s:=s+a[i]; adda:=s; end;

function test(m:integer):boolean; var

i:integer; begin

if m<0 then begin

x: =x-2;

exit(false); end;

if m=0 then begin

writestr(); x:=x-2;

exit(false); end;

for i:=a[x] to n-1 do begin

x:=x+1; a[x]:=i;

if (not test(n-adda())) then begin

exit(true);

end; end;

test:=true; end;

begin

assign(input,'input.txt'); assign(output,'output.txt');

reset(input);

rewrite(output); read(n); x:=0; a[0]:=1; test(n);

close(input); close(output); end.

我们知道,所谓的卡列列克运算,是指任意一个四位数,只要它们各个位上的数不全相同,就有这样的规律:程序名为step.pas

把组成这个四位数的四个数字由大到小排列,形成由这四个数字构成的最大的 四位数;

把组成这个四位数的四个数字由小到大排列,形成由这四个数字构成的最小的四位数(如果四个数字中含有0,则此数不足四位);

求出以上两数之差,得到一个新的四位数。 重复以上过程,总能得到最后结果是6174。

试编写一个程序,实现卡布列克运算,要求以下面的格式输出全部运算过程和结果,统计需要运算的步数(如下例为3步)。 输出格式: n=5346

6543-3456=3087 8730-378=8352 8532-2358=6174 SETP=3 var

n:intege r;

x,max,min:integer;

procedure getmaxmin(m:integer); var

a:array [1..4] of integer; i,j,tmp:integer; begin

i:=1;

while m>0 do begin

a[i]:=m mod 10; m:=m div 10; i:=i+1; end;

for i:=3 downto 1 do begin

for j:=1 to i do begin

if a[j]>a[j+1] then

begin

tmp:=a[j]; a[j]:=a[j+1];

a[j+1]:=tmp; end; end; end;

max:=1000*a[4]+100*a[3]+10*a[2]+a[1]; min:=1000*a[1]+100*a[2]+10*a[3]+a[4]; end;

procedure test(m:integer); var

i:integer; begin

if m=6174 then begin

write('SETP=',x); halt; end;

getmaxmin(m);

writeln(max,'-',min,'=',max-min); x:=x+1;

test(max-min); end;

begin

assign(input,'input.txt');

assign(output,'output.txt'); reset(input); rewrite(output); read(n);

writeln('n=',n); x:=0; test(n);

close(input); close(output); end.

253、溢出 over.p as

问题描述

写一个程序,读入两个非负整数及一个运算符号判断两整数及运算结果是否超出了PASCAL语言中关于长整数类型的定义。(长整数范围为-2147483648到2147483647) 输入文件

一行包含整数和运算符,运算符(‘+’,‘-’,‘*’,‘div’) 输出文件

先输出一遍原输入,并在后面输出0到3行适当内容, 如:first number is too big second number is too big result number is too big 例如: 输入 输出

300+3 300+3

300000*300000 300000*300000 result is too big

9999999999999999999+1 9999999999999999 999+1

first number is too big result number is too big 建议用int64来处理,范围大小是

(-9223372036854775808 .. 9223372036854775807 )

259、最大最小差(MaxMin) 问题描述:

现在有N个正整数,每一次去掉其中2个数a和b,然后加入一个数a*b+1,这样最后只剩下一个数P。要求求出最大

的P记为MaxP,最小的p记MinP,和他们的差K=MaxP-MinP。 对于给定的数列,编程计算出它的Max,Min和K。 输入文件(MAXMIN.IN):

第一行是数列的长度N(不超过50),以下N行,每行一个正整数(不超过2位)。 输出文件(MAXMIN.OUT):

输出一共三行,每行一个整数,依次为max,min,K。 输入输出样例:

MAXMIN.IN MAXMIN.OUT 2 1 1 2 2 0 var

arr:array [0..49] of integer;

excepti:array [0..49] of integer; test:array [0..49] of integer; max,min,n:integer;

procedure InitExcept(); var

i:integer; begin

for i:=0 to n-1 do

excepti[i] := -1; end;

function IsIn(i:integer):boolean; var

j:integer; begin

for j:=0 to n-1 do begin

if excepti[j]=i then exit(true); end;

IsIn:=false; end;

procedure writestr(); var

i,r:integer; begin

联系合同范文客服:xxxxx#qq.com(#替换为@)