等式求和 Pascal 速求!好的追加
发布网友
发布时间:2022-10-17 03:22
我来回答
共2个回答
热心网友
时间:2023-10-27 02:20
等式(100分)
(源程序名:equal.pas或equal.c或equal.cpp,编译后可执行程序名:equal.exe)
【问题描述】
有一个未完成的等式:1 2 3 4 5 6 7 8 9=N
当给出整数N的具体值后,请你在2,3,4,5,6,7,8,9这8个数字的每一个前面,或插入一个运算符号“+”号,或插入一个运算符号“-”号,或不插入任何运算符号,使等式成立,并统计出能使等式成立的算式总数,若无解,则输出0。
例如:取N为108时,共能写出15个不同的等式,以下就是其中的二个算式:
1+23+4+56+7+8+9=108 123-45+6+7+8+9=108
【输入】输入文件equal.in中只有1个数,即整数N的值。
【输出】输出文件equal.out只有一行,该行只有1个数,表示能使等式成立的算式总数。
【输入】
108
【输出】
15
【数据*】
本题共有10组测试数据,每组10分,共100分,对于所有的n,-30000≤n≤1000000
【问题分析】
题目意思简单,要求在1、2、3….9中填入“+”号“-”号,也可以将数字并成更大的数,使得算式的计算结果为N。题目有九个数字,就有八个空格要添符号(其实是九个,在1前面的符号默认为“+”号),每个空格有三种填法,分别穷举,穷举出一种,计算出结果,如果等于N,就把计数器加一,穷举到结束,输出计数器的结果就行了。这种思想,说起来容易做起来难,特别是在穷举好一种添加符号的方法后,计算结果并不容易,下面就具体说明。
【算法分析】
在实际操作中,把1到9中的8个空档定义成数组a[1..8],其中,a[I]=0,表示这一格不填符号,与下一个数字合并,a[I]=-1,表示这一格填“-”号,赋成-1可以方便编程序,在程序中会有所体现,a[I]=1,表示这一格填“+”号,填好符号,就要开始计算了。因为只有+-号,定义算到目前的结果为ans,定义现在正要加或减的但没定下最终值的数据为ch,k记录ans是要+ch,还是-ch。
然后先把k赋为1(1前面的符号默认为+),ch赋为1,ans赋为0,从第一个符号开始,如果是运算符号,那么ch敲定,ans加上ch*k,ch变成下一个数字,k变成第一个符号-1或1,如果是连接符号,就是a[1]=0,那么ch从1连接成了12,就是ch:=ch*10+2,其他不变,之后看第二个符号,如果是运算符号,那么ch敲定,ans加上ch*k,ch变成下一个数字,k变成第二个符号-1或1,如果是连接符号,那么ch:=ch*10+3就行了,继续看下一个符号。
直到完成最后一个符号的操作后,还要将最后的ans+ch*k,算出结果ans就行了。
【程序】
var
a:array [1..8] of longint;
n,l:longint;
procerejie(h:longint);
vark,ch,ans,i:longint;
begin
if h=9 then
begin
k:=1; ch:=1; ans:=0;
for i:=1 to 8 do
if a[i]=0 then ch:=ch*10+i+1{如果是连接符,连接ch与下一个数}
else
begin
ans:=ans+k*ch;{遇到符号,先完成前一步的加减}
ch:=i+1;{ch变成下一个数}
k:=a[i];{k存储ans与ch的加减关系}
end;
ans:=ans+ch*k;{这步别忘了}
if ans=n then L:=L+1;
end
else
for i:=-1 to 1 do{穷举八个符号位的符号}
begin
a[h]:=i;
jie(h+1);
end;
end;
begin
assign(input,'equal.in'); reset(input);
assign(output,'equal.out'); rewrite(output);
readln(n);
L:=0;
JIE(1);
WRITE(L);
close(input); close(output);
end.
热心网友
时间:2023-10-27 02:20
【背景】早期的省选题;
【难度系数】***(按理说该是送分的)
【算法分析】因未给出数据规模,本人认为深度优先搜索或者宽(广)搜:
模拟 一个个试;
①深搜者,程序加入计数器,末尾出值;
②广搜者,无需判重,外加人工人脑剪枝,eg全是+/-在某些n值下必定不行,跳出后出值;
(鄙人曾试过了,Ac,不知是数据太弱还是算法太强(Oh,shit!这也算算法,O(∩_∩)O~))
【源程序清单】略~请主自行编写;
最后祝学业有成;