计算下列程序片段的时间代价: int i=1; while(i<=n){ int i=1; while(j<=n){ int k=1; while(k
计算下列程序片段的时间代价:
int i=1;
while(i<=n){
int i=1;
while(j<=n){
int k=1;
while(k<=n){
printf("i=%d,j=%d,k=%d\n",I,j,k);
k=k+1;
j
j=j+1;
}
i=i+1;
}
计算下列程序片段的时间代价:
int i=1;
while(i<=n){
int i=1;
while(j<=n){
int k=1;
while(k<=n){
printf("i=%d,j=%d,k=%d\n",I,j,k);
k=k+1;
j
j=j+1;
}
i=i+1;
}
若有下面的程序片段: int[12]={0},*p[3],**pp,i; for(i=0;i<3;i) p[i]=&a[i*4]; pp=p; 则对数组元素的错误引用是
若有下面的程序片段:
int[12]={0},*p[3],**pp,i;
for(i=0;i<3;i)
p[i]=&a[i*4];
pp=p;
则对数组元素的错误引用是
A.pp[0][1]
B.a[10]
C.p[3][1]
D.*(*(p+2)+2)
下面程序片段的运行结果是()。 public class Test { public static void main (String args[]) { int a=10,b=4,c=20,d=6; System.out.println (a++ *b+c* --d); } }
A.144
B.160
C.140
D.164
下面程序片段的执行中,说法正确的是()。 public class Test { public static void main (String args[]) { byte y=20; int i=y; int x=100; y=x; System.out.println(y); } }
A.输出y的值为100
B.第4行错误
C.输出y的值为20
D.第6行错误
试题四(15分)
阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。
【说明】
某工程计算中要完成多个矩阵相乘(链乘)的计算任务。
两个矩阵相乘要求第一个矩阵的列数等于第二个矩阵的行数,计算量主要由进行乘法运算的次数决定。采用标准的矩阵相乘算法,计算Am*n*Bn*p,需要m*n*p次乘法运算。
矩阵相乘满足结合律,多个矩阵相乘,不同的计算顺序会产生不同的计算量。以矩阵A110*100,A2100*5,A35*50三个矩阵相乘为例,若按(A1*A2)*A3计算,则需要进行10*100*5+10*5*50=7500次乘法运算;若按A1*(A2*A3)计算,则需要进行100*5*50+10*100*50=75000次乘法运算。可见不同的计算顺序对计算量有很大的影响。
矩阵链乘问题可描述为:给定n个矩阵<A1,A2,….An>,矩阵Ai的维数为pi-1*Pi,其中i = 1,2,….n。确定一种乘法顺序,使得这n个矩阵相乘时进行乘法的运算次数最少。
由于可能的计算顺序数量非常庞大,对较大的n,用蛮力法确定计算顺序是不实际的。经过对问题进行分析,发现矩阵链乘问题具有最优子结构,即若A1*A2*…*An的一个最优计算顺序从第k个矩阵处断开,即分为A1*A2*….Ak和Ak+1*Ak+2*…*An两个子问题,则该最优解应该包含A1*A2*…*Ak的一个最优计算顺序和Ak+1*Ak+2*…An的一个最优计算顺序。据此构造递归式,
其中,cost[i][j]表示Ai+1*Ai+2*...Aj+1的最优计算的计算代价。最终需要求解cost[0][n-1]。
【C代码】
算法实现采用自底向上的计算过程。首先计算两个矩阵相乘的计算量,然后依次计算3个矩阵、4个矩阵、…、n个矩阵相乘的最小计算量及最优计算顺序。下面是算法的C语言实现。
(1)主要变量说明
n:矩阵数
seq[]:矩阵维数序列
cost[][]:二维数组,长度为n*n,其中元素cost[i][j]表示Ai+1*Ai+2*…Aj+1的最优计算的计算代价
trace[][]:二维数组,长度为n*n,其中元素trace[i][j]表示Ai+1*Ai+2*Aj+1的最优计算对应的划分位置,即k
(2)函数cmm
define N 100
intcost[N][N];
inttrace[N][N];
int cmm(int n,int seq[]){
int tempCost;
int tempTrace;
int i,j,k,p;
int temp;
for(i=0;i<n;i++){ cost[i][i] =0;}
for(p=1;p<n;p++){
for(i=0; (1) ;i++){
(2);
tempCost = -1;
for(k = i;k<j;k++){
temp = (3) ;
if(tempCost==-1||tempCost>temp){
tempCost = temp;
(4) ;
}
}
cost[i][j] = tempCost;
trace[i][j] = tempTrace;
}
}
return cost[0][n-1];
}
【问题1】(8分)
根据以上说明和C代码,填充C代码中的空(1)~(4)。
【问题2】(4分)
根据以上说明和C代码,该问题采用了 (5) 算法设计策略,时间复杂度 (6) 。(用O符号表示)
【问题3】(3分)
考虑实例n=6,各个矩阵的维数:A1为5*10,A2为10*3,A3为3*12,A4为12*5,A5为5*50,A6为50*6,即维数序列为5,10,3,12,5,50,6。则根据上述C代码得到的一个最优计算顺序为 (7) (用加括号方式表示计算顺序),所需要的乘法运算次数为 (8) 。
下列给定程序中,fun()函数的功能是:根据形参m,计算下列公式的值。
t=1-1/2+1/3-1/4+…+(-1)(m+1)/m
例如,若输入5,则应输出0.783333。
请改正程序中的错误,使它能得到正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
include <conio.h>
include <stdio.h>
/*************found*************/
int fun(int m)
{
double t=1.0,j=1.0;
int i;
/*************found*************/
for(i=l;i<m;i++)
{j=-1*j;t+=j/i;}
return t;
}
main()
{
int m;
clrscr();
printf("\nPlease enter 1 integer number:");
scanf("%d",&m);
printf("/nThe result is%If\n",fun(m));
}
下列给定程序中,函数fun()的功能是根据整型形参m,计算如下公式的值。
y=1-1/(2×2)+1/(3×3)-1/(4×4)+…+(-1)(m+1)/(m×m)
例如:m中的值为5,则应输出0.838611。
请改正程序中的错误,使它能得到正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
include <conio.h>
include <stdio.h>
double fun(int m)
{double y=1.0;
/**********found*************/
int j=1;
int i;
for(i=2;i<=m;i++)
{
j=-1*j;
/****************found*******+******/
y+=1/(i*i);
}
return(y);
}
main()
{
int n=5;
clrscr();
printf("\n The result is %lf\n",fun(n));
}
下列给定程序中,函数fun()的功能是:根据整型形参m的值,计算如下公式的值。
t=1-1/(2×2)-1/(3×3)-…-l/(m×m)
请改正函数fun()中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
include <conio.h>
include <stdio.h>
double fun(int m)
{ double y=1.O;
int i;
/*************found**************/
for(i=2;i<m;i++)
/************found**************/
y-=1/ (i*i);
return(y);
}
main()
{ int n=5;
clrscr();
printf("\nThe result is %1f\n", fun(n));
}
下列给定程序中,函数fun()的功能是:根据整型参数m,计算如下公式的值。
y=1/(100×100)+1/(200×200)+1/(300×300)+…+1/(m×m)
例如,若m=2000,则应输出0.000160。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
include <conio.h>
include <stdio. h>
/*************found**************/
fun (int m)
{ double y=0, d;
int i;
/*************found**************/
for (i=100, i<=m, i+=100)
{d= (double) i* (double) i;
y+=l. 0/d;
}
return (y);
}
main ()
{ int n=2000;
clrscr();
printf("\nThe result is %lf\n",fun(n));
下列给定程序中,函数fun()的功能是:传入一个整数m,计算如下公式的值。
t=1/2-1/3-…-1/m
例如,若输入5,则应输出-0.283333。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
include <conio.h>
include <stdio.h>
double fun(int m)
{
double t=l.0;
int i;
for (i=2; i<=m; i++)
/*************found**************/
t=l.0-1/i;
/*************found**************/
}
main ()
{int m;
clrscr ();
printf ("\nPlease enter 1 integer numbers
: In");
scanf ("%d", &m);
printf("\n\nThe result is %lfln",
fun (m));
}