作业帮 > 综合 > 作业

pascal选数已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/25 23:55:42
pascal选数
已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为:  3+7+12=22  3+7+19=29  7+12+19=38  3+12+19=34.  现在,要求你计算出和为素数共有多少种.  例如上例,只有一种的和为素数:3+7+19=29).
输入:
n ,k (1< =n< =20,k<n) x1,x2,…,xn (1< =xi< =5000000
输出:
一个整数(满足条件的种数).
样例输入:
4 3
3 7 12 19
样例输出:
1
(用素数比素数,有筛法求素数,说简单一点就是:使时间复杂度尽可能低.重要的几句代码要有注释,越多越好)
答的好加赏!
program kkk;
var n,s,i,p,x,ans:longint;
k:qword;
a:array[1..5000000] of longint;
procedure init;
var i:longint;
begin
read(n,k);{输入第一行}
for i:=1 to n do
read(a[i]);{输入第二行}
ans:=0;{初始化}
end;
function ok(x:longint):boolean;{判断型函数}
var i:longint;
begin
ok:=true;{初始化}
for i:=2 to trunc(sqrt(x))do{大可不必用筛法了,直接判断}
if x mod i=0 then{判断是否为素数}
begin
ok:=false;{错误}
break;{终止循环}
end;
end;
procedure run(s,i,p:longint);
var j:longint;
begin
if p=k+1 then
begin
if ok(s)then{若为素数}
inc(ans);{加一}
exit;{终止并退出子程序}
end;
for j:=i+1 to n do
run(s+a[j],j,p+1);{回溯赋值}
end;
begin{主程序}
init;
run(s,i,p);
writeln(ans);{输出}
end.
可以了吧.