1-8 设n为正整数,分析下列各程序段中斜线部分语句的执行次数。
(1)

for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++){
c[i][j]=0.0;
for (int k=1;k<=n;k++)
c[i][j]=c[i][j]+a[i][k]*b[k][j];
}

执行了n^3次。

(2)

x=0;y=0;
for (int i=1;i<=n;i++)
for (int j=1;j<=i;j++)
for (int k=1;k<=j;k++)
x=x+y;

执行次数为1+(1+2)+(1+2+3)+...+(1+2+3+...+n)
计算得n^3/6+n^2/2+n/3
ps:这个程序段也太搞笑了,加来加去x还是0.

(3)

int i=1,j=1;
while(i<=n&&j<=n){
i=i+1; j=j+1;
}

j随着循环次数k的递增是j=1+2+3+...+k+k+1
即(k+2)(k+1)/2<=n
解不等方程得
k <=(开根(8n+1)-3)/2
最后一次执行i=i+1必定是第一次导致j>n的结果,所以
执行次数为 取下整((开跟(8n+1)-3)/2)+1

(4)

int i=1;
do{
for (int j=1;j<=n;j++)
i=i+j;
}while(i < 100+n);

分析,
j=1,2,3,4……
i=2,4,7,11……
正好符合递推公式i=1+(n+1)n/2
而当n=14时,i=106< 100+n
当n=15时,i=121 >100+n
程序句的执行次数分如下情况
当n>=15时,程序的执行次数由内循环for决定,而外循环do while只能执行一次,所以程序的执行次数为n次;
然后计算n=1~14的情况
设k为外循环while的执行次数,则程序结束前一步,i的值
i=1+k(n+1)n/2< 100+n 其中k为满足不等式的最大值
此时,外循环将再执行一次,所以语句共执行次数为(k+1)*n
ps:我感觉这里配套教材给出的答案是错的。

Comments (0)