算法习题及解答
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一个自然数可以写成若干个小于等于自己的自然之和,这叫该自然数的一个分解。不同的分解是表示这个自然数分解成的所有自然数不完全相同。例如: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