pascal问题:一个射击运动员打靶,靶一共有10环,连开10枪打中90环的可能行有多少种? ( 积分: 50 )

  • 主题发起人 主题发起人 2tt1314
  • 开始时间 开始时间
2

2tt1314

Unregistered / Unconfirmed
GUEST, unregistred user!
一个射击运动员打靶,靶一共有10环,连开10枪打中90环的可能行有多少种?
 
又来一个问作业的?

最简单的,10重循环就OK了.
 
10重循环好象重复了可能性。

不知道楼主求的可能性 包括不包括 顺序的,
比如前9枪都10环 最后一枪没中;和前一枪没中,后面都10环——这样算不算2种可能性?
如果算,楼上正解。
 
哦 刚想了一下,白河的回答 是对的,看怎么循环。
 
to白河愁:这不是作业..
不可以用10重循环..大家看下C++的代码
#include <iostream>

using namespace std;

int sum;

int store[10];

void Output()

{

for(int i = 9
i>=0
--i)

{

cout<<store<<&quot
&quot;;

}

cout<<endl;

++sum;

}



void Cumput(int score, int num)

{

if(score < 0 || score > (num+1)*10 ) //次数num为0~9

return;

if(num == 0)

{

store[num] = score;

Output();

return;

}

for(int i = 0
i <= 10
++i)

{

store[num] = i;

Cumput(score - i, num - 1);

}

}



int main(int argc, char* argv[])

{

Cumput(90, 9);

cout<<&quot;总数:&quot;<<sum<<endl;

return 0;

}



我就是不知道怎么转换成pascal
 
一环不中也算.
 
http://book.csdn.net/bookfiles/107/1001073091.shtml
 
用了递归,不如循环直观啊,不过循环编写起来确实比较递归烦琐很多,要不效率就比不上递归......(虽然递归没什么效率可言,但这个例子思路确实是很好。)

LZ把这个程序都改成PASCAL不就得了?
慢慢改,一句一句的统统换成PASCAL就行,里面就<<不能替换,都是显示用的,你就改成其他的显示方式。
 
1 不是作业还能是什么,也许是公司面试题,实际应用中根本就是没用的东西.

2 为什么不可以用10重循环,能做出来就行,除非老师或公司规定了.

3 循环当然不算是个好方法,但思路清晰明了,容易写出来.

4 既然有代码了就自己改下,如果这么简单的代码都不会难以想像能写出什么程序.
 
不过还是那个问题:
(0,10,10,10,10,10,10,10,10,10)

(10,0,10,10,10,10,10,10,10,10)

(10,10,0,10,10,10,10,10,10,10)
实际上应该算是同一种可能性,就是:9个10环 1个0环。(比如新闻报道,人家都是说有几个10环几个9环的,好象没听说过第一个多少第二个多少.....)

如果这样算,那个递归的算法结果好象是不对的,不知道是不是....
 
(0,10,10,10,10,10,10,10,10,10)

(10,0,10,10,10,10,10,10,10,10)

(10,10,0,10,10,10,10,10,10,10)
不是同一种可能性.

我用10重循环好像编译不出来...所以才上来发帖的..
 
最没有效率的写法
i:=0;memo1.clear;
for i1:=0 to 10 do
for i2:=0 to 10 do
...
for i10:=0 to 10 do
if i1+i2+i3.....=90 then
begin
Memo1.line.add(inttostr(i1)+' '+inttostr(i2)+' '+....)
i:=i+1;
end;
i=组合的数量

ok?
 
事实证明,10重循环是可行的.不过要算两三分钟.而且CPU使用率真一直处于100%状态.
 
多人接受答案了。
 
var a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,count:integer;
begin
count:=0;
for a1:=0 to 10 do
for a2:=0 to 10 do
if a1+a2>=10 then //前两靶达不到10环,后8靶全10环也达不到90环.
for a3:=0 to 10 do
if a1+a2+a3>=20 then
for a4:=0 to 10 do
if a1+a2+a3+a4>=30 then
for a5:=0 to 10 do
if a1+a2+a3+a4+a5>=40 then
for a6:=0 to 10 do
if a1+a2+a3+a4+a5+a6>=50 then
for a7:=0 to 10 do
if a1+a2+a3+a4+a5+a6+a7>=60 then
for a8:=0 to 10 do
if a1+a2+a3+a4+a5+a6+a7+a8>=70 then
for a9:=0 to 10 do
if a1+a2+a3+a4+a5+a6+a7+a8+a9>=80 then
for a10:=0 to 10 do
if a1+a2+a3+a4+a5+a6+a7+a8+a9+a10=90 then
begin
count:=count+1;
writeln(a1,'+',a2,'+',a3,'+',a4,'+',a5,'+',a6,'+',a7,'+',a8,'+',a9,'+',a10,'=','90');
end;

writeln(count);
readln;
end.
 
后退
顶部