已知有一维数组A[0,…,m×n-1],若要对应为m行、n列的矩阵,则下面的对应关系(73)可将元素A[k](0≤k<m×n)表示成矩阵的第i行、第j列的元素(0≤i<m, 0≤j<n)。A.i=k/n,j=k%mB.i=k/m,j=k%mC.i=k/n,j=k%nD.i=k/m,j=k%n

题目

已知有一维数组A[0,…,m×n-1],若要对应为m行、n列的矩阵,则下面的对应关系(73)可将元素A[k](0≤k<m×n)表示成矩阵的第i行、第j列的元素(0≤i<m, 0≤j<n)。

A.i=k/n,j=k%m

B.i=k/m,j=k%m

C.i=k/n,j=k%n

D.i=k/m,j=k%n


相似考题

1.阅读下列程序说明和C代码,将应填入(n)处的字句写在对应栏内。【说明】设某城市有n个车站,并有m条公交线路连接这些车站,设这些公交车都是单向的,这n个车站被顺序编号为0至n-1。输入该城市的公交线路数、车站个数,以及各公交线路上的各站编号,求得从站0出发乘公交车至站n-1的最少换车次数。程序利用输入信息构建一张有向图G(用邻接矩阵g表示),有向图的顶点是车站,若有某条公交线路经i站能到达j站,就在顶点i到顶点j之间设置一条权为1的有向边<i,j>。如是这样,从站点x至站点y的最少上车次数便对应图G中从点x至点y的最短路径长度。而程序要求的换车次数就是上车次数减1。【函数5-9】include <stdio.h>define M 20define N 50int a[N+1]; /*用于存放一条线路上的各站编号*/iht g[N][N]; /*存储对应的邻接矩阵*/int dist[N]; /*存储站0到各站的最短路径*/int m,n;void buildG(){int i,j,k,sc,dd;printf ("输入公交线路数,公交站数\n");scanf("%d%d", &m, &n);for(i=0; i<n; i++) /*邻接矩阵清0*/for(j = 0; j < n; j++)g[i][j] = 0;for(i=0; i<m; i++){printf("沿第%d条公交车线路前进方向的各站编号(O<=编号<=%d,-1结束):\n",i+1, n-1);sc=0;/* 当前线路站计数器 */while(1){scanf("%d",&dd);if(dd==-1)break;if(dd>=0 && dd<n) (1);}a[sc]=-1;for(k=1;a[k]>=0; k++) /* 处理第i+1条公交线路 */for(j=0; j<k; j++)g(2)=1;}}int minLen(){int j, k;for(j=0;j<n;j++)dist[j]=g[0][j];dist[0]=1;do{for(k=-1,j=0;j<n;j++) /* 找下一个最少上车次数的站*/if(dist[j]>0&&(k==-1 || dist[j]<dist[k]))k=j;if (k<0 || k==n-1) break;dist[k]=-dist[k]; /* 设置k站已求得上车次数的标记 */for(j=1;j<n;j++) /* 调整经过k站能到达的其余各站的上车次数 */if ((3) && (dist[j]==0 || -dist[k]+1<dist[j]))dist[j]=(4);}while(1);j=dist[n-1];return (5);}void main(){int t;buildG();if((t=minLen()<0)printf("无解!\n");else pdnff("从0号站到%d站需换车%d次\n”,n-1,t);}

更多“已知有一维数组A[0,…,m×n-1],若要对应为m行、n列的矩阵,则下面的对应关系(73)可将元素A[k](0≤k<m×n)表示成矩阵的第i行、第j列的元素(0≤i<m, 0≤j<n)。A.i=k/n,j=k%mB.i=k/m,j=k%mC.i=k/n,j=k%nD.i=k/m,j=k%n”相关问题
  • 第1题:

    下面程序段的时间复杂度是()。for(j=0;jfor(k=0;ka[j][k]=j*k;

    A、O(m2)

    B、O(n2)

    C、O(m*n)

    D、O(m+n)


    参考答案:B

  • 第2题:

    请编一个函数void fun( int tt[M][N], int pp[N], tt指向一个M行N列的二维数组,求出二维数组每列中最大元素,并依次放入pp所指的一维数组中。二维数组中的数已在主函数中给出。

    注意:部分源程序给出如下。

    请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

    试题程序:

    include <conio.h>

    include <stdio.h>

    define M 3

    define N 4

    void fun(int tt[M][N],int pp[N])

    {

    }

    main()

    {

    int t[M] [N]={{68,32,54,12},{14,24,88,

    58},{42, 22, 44, 56}};

    int p[N],i,j,k;

    clrscr();

    printf("The riginal data is:\n");

    for(i=0;i<M;i++)

    {

    for(j=0;j<N;j++)

    printf("%6d",t[i][j]);

    printf("\n");

    }

    fun(t,p);

    printf("\nThe result is:\n");

    for(k=0;k<N;k++)

    printf("%4d",p[k]);

    printf("\n");

    }


    正确答案:void fun(int tt[M][N]int pp[N]) { int iimax; for(j=0;jN;j++) { max=tt[0][j]; /*假设各列中的第一个元素最大*/ for(i=0;iM;i++) if(tt[i][j]>max) /*如果各列中的其他元素比最大值大则将这个更大的元素看作当前该列中最大元素*/ max=tt[i][j]; pp[j]=max; /*将各列的最大值依次放入pp数组中*/ } }
    void fun(int tt[M][N],int pp[N]) { int i,i,max; for(j=0;jN;j++) { max=tt[0][j]; /*假设各列中的第一个元素最大*/ for(i=0;iM;i++) if(tt[i][j]>max) /*如果各列中的其他元素比最大值大,则将这个更大的元素看作当前该列中最大元素*/ max=tt[i][j]; pp[j]=max; /*将各列的最大值依次放入pp数组中*/ } } 解析:本题中函数的功能是求出二维数组中每列的最大元素。首先,假设各列中的第一个元素最大,然后利用行标值的移动来依次取得各列中其他元素的值,并与假设的最大值进行比较,如果遇到更大的,则把这个更大的元素看做当前该列中最大的元素,继续与该列中其他元素比较。

  • 第3题:

    下面程序段的执行结果为( )。 int i=3,j=0,k=0; for(;i>0;--i) { ++k; do { ++j; if (i!=j) break; ++k; }while(j<5); } printf("i=%d j=%d k=%d\n",i,j,k);

    A.i=0 j=4 k=12

    B.i=0 j=5 k=5

    C.i=0 j=4 k=4

    D.i=0 j=3 k=3


    正确答案:C
    解析:程序开始时(i,j,k)三个值分别为(3,0,0),然后进入for循环,由于for的第一条语句空缺,所以不做初始化,此时i为3满足循环条件,进入循环体。然后执行“++k;”使k变成1,再无条件进入do-while循环体执行“++j;”使j变成1,此时i和j不相等所以执行break;语句跳出do-while循环。准备开始第二遍for循环,i的值被减1,此时3个值分别为(2,1,1),i为2满足循环条件,进入循环体。然后依次执行++k;和++j;使它们增1,此时i和j同为2相等,所以跳过break;语句再执行一次++k;使k为3,由于此时j满足do-while的循环条件,所以下一步回到前面执行do后面的++j;语句,使j为3,此时i和j不相等,所以执行break;跳出do-while循环。准备开始第三遍for循环,i的值被减1,此时3个值分别为(1,3,3),i为1满足循环条件,进入循环体。然后依次执行++k;和++j;使它们增1,此时i和j不相等,所以执行break;跳出do-while循环。准备开始第四遍for循环,i的值被减1,此时3个值分别为(0,4,4),i为0不满足for语句的循环条件,所以执行循环体后面的printf()函数输出3个值,故正确答案为C。

  • 第4题:

    以下程序中,函数 sumColumM的功能是:求出M行N列二维数组每列元素中的最小值,并计算它们的和值。和值通过形参传回主函数输出。请填空。

    define M 2

    define N 4

    void SumColumMin(int a[M][N],int *sum)

    { int i,j,k,s=0;

    for(i=0;i〈N;i++)

    { k=0;

    for(j=1;j<M;j++)

    if(a[k][i]>a[j][i])k=j;

    s+=【 】;

    }

    【 】 =s;

    }

    main( )

    { int x[M][N]={3,2,5,1,4,1,8,3},s;

    SumColumMin(【 】);

    printf("%d\n",s);

    }


    正确答案:a[k][i] *sum x[M][N]&s
    a[k][i] *sum x[M][N],&s 解析:本题中if(a[k][I] >a [j] [I]) k=j;把一列中值较小的一个元素的索引存储到k中,所以[18]填[k] [i],[19]填返回值,右值为整型,所以应该填。sum,SnmColumMin(  )函数第一个参数为数组a[M][N],第二个参数为一个整型指针,所以[20]填x[M][N],&s。

  • 第5题:

    请读程序: include main( ) { int n[2],i,j,k; { for(i=0,i<2;i + + )n[i]=0;

    请读程序: # include<srdio.h> main( ) { int n[2],i,j,k; { for(i=0,i<2;i + + )n[i]=0; k=2; for(i=0;i<k;i+ +) {for(j=0;j<k;j+ +)n[j]=n[i]+l; print{("%d\n",n[k]); } 上面程序片段输出结果是 ( )

    A.不确定的值

    B.3

    C.23

    D.1


    正确答案:A

  • 第6题:

    阅读下列C程序和程序说明,将应填入(n)处的字句写在对应栏内。

    【说明】设某城市有n个车站,并有m条公交线路连接这些车站,设这些公交车都是单向的,这n个车站被顺序编号为0至n-1。本程序,输入该城市的公交线路数、车站个数,以及各公交线路上的各站编号,求得从站0出发乘公交车至站n-1的最少换车次数。

    程序利用输入信息构建一张有向图G(用邻接矩阵g表示),有向图的顶点是车站,若有某条公交线路经i站到达j站,就在顶点i到顶点j之间设置一条权为1的有向边<i,j>。如果这样,从站点x至站点y的最少上车次数便对应图G中从点x到点y的最短路径长度。而程序要求的换车次数就是上车次数减1。

    include <stdio.h>

    define M 20

    define N 50

    int a[N+1]; /*用于存放一条线路上的各站编号*/

    int g[N][N]; /*严存储对应的邻接矩阵*/

    int dist[N]; /*严存储站0到各站的最短路径*/

    int m, n;

    void buildG()

    { int i, j, k, sc, dd

    printf(“输入公交线路数,公交站数\n”);

    scanf("%d%d",&m,&n);

    for (i=0;i<n;i++) /*邻接矩阵清0*/

    for(j=0;j<n;j++)

    g[i][j]=0;

    for(i=0;i<m;i++)

    { printf("沿第%d条公交线路的各站编号(0<=编号<=%d,-1结束):\n)",i+1,n-1);

    sc=0; /* 当前线路站计数器*/

    while(1)

    { scanf("%d",&dd);

    if(dd=-1)break;

    if(dd>=0 && dd<n) (1);

    }

    a[sc]=-1;

    for(k=1;a[k]>=0;k++) /*处理第i+1条公交线路*/

    for(j=0;j<k;j++)

    g (2)=1;

    }

    }

    int minLen()

    { int j,k;

    for(j=0;j<n;j++)

    dist[j]=g[0][j];

    dist[0]=1;

    do{

    for(k=-1,j=0;j<n;j++) /*找下一个最少上车次数的站*/

    if(dist[j]>0 &&(k==-1||dist[j]<dist[k]))

    k=j;

    if(k<0||k==n-1)

    break;

    dist[k]=-dist[k]; /*设置k站已求得上车次数的标记*/

    for (j=1;j<n;j++) /*调整经过k站能到达的其余各站的上车次数*/

    if((3)&& (dist[j]=0||-dist[k]+1<dist[j]))

    dist[j]=(4);

    }while(1);

    j=dist[n-1];

    return (5);

    }

    void main()

    { int t;

    buildG();

    if((t=minLen())<0)

    printf("无解!\n");

    else

    printf(“从0号站到%d站需换车%d次\n”,n-1,t);

    }


    正确答案:(1)a[sc++]=dd (2)[a[J][a[k]] (3)dist[j]>=0 && g[k][j]==1 (4)-dist[k]+1 (5)k0?-1:j-1
    (1)a[sc++]=dd (2)[a[J][a[k]] (3)dist[j]>=0 && g[k][j]==1 (4)-dist[k]+1 (5)k0?-1:j-1 解析:(1)a[sc++]=dd
    将dd赋值给当前线路的a[sc],并同时将当前线路站计数器加1。
    (2)[a[J][a[k]]
    将a[j]和a[k]之间置为通路1。
    (3)dist[j]>=0 && g[k][j]==1
    若dist[j]并且k和j之间有通路,或-dist[k]+1dist[j],也就是经过k对于j来说上车次数更少,则调整经过k站能到达的其余各站的上车次数。
    (4)-dist[k]+1
    让dist[j]取经过k的更少上车次数-dist[k]+1。
    (5)k0?-1:j-1
    若k小于0,表示无解;否则返回j-1也就是上车次数减1。

  • 第7题:

    请补充函数fun(),该函数的功能是:寻找两个整数之间的的所有素数(包括这两个整数),把结果保存在数组bb中,函数返回素数的个数。

    例如,输入6和21,则输出为:7 11 13 17 19 21。

    注意:部分源程序给出如下。

    请勿改动主函数main 和其他函数中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。

    试题程序:

    include<conio. h>

    include<stdio. h>

    define N 1000

    int fun (int n, int m, int bb [N])

    {

    int i, j, k=0, flag;

    for (j=n; j<=m; j++)

    {

    【 】;

    for (i=2; i<j; i++)

    if(【 】)

    {

    flag=0;

    break;

    }

    if(【 】)

    bb [k++] =j

    }

    return k;

    }

    main ()

    {

    int n=0,m=0, i, k;

    int bb[N];

    clrscr ();

    printf ("Input n\n");

    scanf ("%d", &n);

    printf ("Input m\n");

    scanf ("%d", &m);

    for (i=0; i<m-n; i++)

    bb[i]=0;

    k=fun (n, m, bb);

    for (i=0; i<k; i++)

    printf ("%4d",bb [i]);

    }


    正确答案:I p->next=s p->next
    I p->next=s p->next 解析:第一空:题目要求各结点的值为对应的下标,头结点的值为0,其他结点的值从1开始,所以此空应填i。第三空:为了将结点p和结点s连接起来,应将结点p的next 指针指向结点s。第三空:为了通过for 循环形成链表,每执行完一次循环操作,都要将指针p 指向下一个结点。

  • 第8题:

    在窗体上画2个命令按钮,名称分别为Command1、Command2,然后编写下列事件过程。 Const n=5.m=4 Dim a(m,n) Private Sub+Command1 Click( ) k=1 For i=1 To m For j=1 To n a(i,j)=k k=k+1 Next j Next i End Sub Private Sub Command2 Click( ) summ=0 For i=1 To m For j=1 To n If i=1 Or i=m Then summ=summ+a(i,j) Else If j=1 Or j=n Then summ=summ+a(i,j) End If End If Next j Next i Print summ End Sub 过程Command1_Click( )的作用是在二维数组a中存放1个m行n列的矩阵;过程Command2 Click( )的作用是( )。

    A.计算矩阵外围一圈元素的累加和

    B.计算矩阵除外围一圈以外的所有元素的累加和

    C.计算矩阵第1列和最后一列元素的累加和

    D.计算矩阵第1行和最后一行元素的累加和


    正确答案:A
    A。【解析】IF语句的Then语句是用于计算第一行和最后一行元素的累加和,而Else语句是计算第一列和最后一列元著的累加和。故应该是计算外围的一圈元素的累加和。

  • 第9题:

    ●试题一

    阅读下列说明和流程图,将应填入(n)处的语句写在答题纸的对应栏内。

    【说明】

    下列流程图用于从数组K中找出一切满足:K(I)+K(J)=M的元素对(K(I),K(J))(1≤I≤J≤N)。假定数组K中的N个不同的整数已按从小到大的顺序排列,M是给定的常数。

    【流程图】

    此流程图1中,比较"K(I)+K(J)∶M"最少执行次数约为 (5) 。

    图1


    正确答案:
    ●试题一【答案】(1)(2)<(3)I+l->I(4)J-1->J(5)「N/2」【解析】该算法的思路是:设置了两个变量I和J,初始时分别指向数组K的第一个元素和最后一个元素。如果这两个元素之和等于M时,输出结果,并这两个指针都向中间移动;如果小于M,则将指针I向中间移动(因为数组K已按从小到大的顺序排列);如果大于M,则将指针J向中间移动(因为数组K已按从小到大的顺序排列)。当IJ时,说明所有的元素都搜索完毕,退出循环。根据上面的分析,(1)、(2)空要求填写循环结束条件,显然,(1)空处应填写"",(2)空处应填写"<"。这里主要要注意I=J的情况,当I=J时,说明指两个指针指向同一元素,应当退出循环。(3)空在流程图有两处,一处是当K(I)+K(J)=M时,另一处是当K(I)+K(J)<M时,根据上面分析这两种情况都要将指针I向中间移动,即"I+1->I"。同样的道理,(4)空处应填写"J-1->J"。比较"K(I)+K(J):M"最少执行次数发生在第1元素与第N个元素之和等于M、第2元素与第N-1个元素之和等于M、……,这样每次比较,两种指针都向中间移动,因此最小执行次数约为"N-2"。

  • 第10题:

    下面的子程序求一方阵的次对角线上的元素之和
    SUBROUTINE CDJX(M,N,K)
    DIMENSION M(N,50)
    DO 10 J=1,N
    K= {pz_填空}
    10 CONTINUE
    RETURN
    END
    为了使程序完整,应在{pz_填空}处填入的是:
    (A)K+M(J,J)
    (B)K+M(J,N+1-J)
    (C)K+M(N-J,J)
    (D)K+M(N+J,N-J)


    答案:B
    解析:

  • 第11题:

    已知有一维数组A[0.m×n-1],若要对应为m行n列的矩阵,则下面的对应关系(),可将元素A[k](O≤<k≤<m×n)表示成矩阵的第i行、第j列的元素(0≤i≤m,0匀≤n)。

    A. i=k/n,j=k%m
    B.i=k/m,j=k%m
    C.i=k/n,j=k%n
    D.i=k/m,j=k%n

    答案:C
    解析:
    矩阵每一行有n个元素,则第i+l行、第j+l到的元素~在A中是第n×i+j+l个元素,对应的下标k=nXi+j(因为下标从0开始)。反过来:i=k/n,j=k%n。

  • 第12题:

    设二维数组A[0…m-1][0…n-1]按行优先顺序存储在内存中,第一个元素的地址为p,每个元素占k个字节,则元素aij的地址为()。

    • A、p+[i*n+j-1]*k
    • B、p+[(i-1)*n+j-1]*k
    • C、p+[(j-1)*n+i-1]*k
    • D、p+[j*n+i-1]*k

    正确答案:A

  • 第13题:

    阅读下列说明和流程图,将应填入(n)处的语句写在对应栏内。

    【说明】

    下列流程图用于从数组K中找出一切满足:K(I)+K(J)=M的元素对(K(I),K(J))(1≤I≤J≤N)。假定数组K中的N个不同的整数已按从小到大的顺序排列,M是给定的常数。

    【流程图】

    此流程图1中,比较“K(I)+K(J):M”最少执行次数约为(5)。


    正确答案:(1) (2) (3)I+1->I (4)J-1->J (5)[N/2]
    (1) (2) (3)I+1->I (4)J-1->J (5)[N/2] 解析:该算法的思路是:设置了两个变量I和J,初始时分别指向数组K的第一个元素和最后一个元素。如果这两个元素之和等于M时,输出结果,并这两个指针都向中间移动;如果小于M,则将指针I向中间移动(因为数组K已按从小到大的顺序排列);如果大于M,则将指针J向中间移动(因为数组K已按从小到大的顺序排列)。当IJ时,说明所有的元素都搜索完毕,退出循环。
    根据上面的分析,(1)、(2)空要求填写循环结束条件,显然,(1)空处应填写“”,(2)空处应填写“”。这里主要要注意I=J的情况,当I=J时,说明指两个指针指向同一元素,应当退出循环。
    (3)空在流程图有两处,一处是当K(I)+K(J)=M时,另一处是当K(I)+K(J)M时,根据上面分析这两种情况都要将指针I向中间移动,即“I+1->I”。同样的道理,(4)空处应填写“J-1->J”。
    比较“K(I)+K(J):M”最少执行次数发生在第1元素与第N个元素之和等于M、第2元素与第N-1个元素之和等于M、……,这样每次比较,两种指针都向中间移动,因此最小执行次数约为“N-2”。

  • 第14题:

    下列给定程序中,函数fun()的功能是:根据形参m的值(2≤m≤9),在m行m列的二维数组中存放如下所示的数据,由 main()函数输出。

    例如,若输入2,则输出1 2

    2 4

    输入4,则输出1 2 3 4

    2 4 6 8

    3 6 9 12

    4 8 12 16

    请改正程序中的错误,使它能得出正确的结果。

    注意:不要改动main函数,不得增行或删行,也不得更改程序的结构.

    试题程序:

    include <conio.h>

    include <stdio. h>

    define M 10

    int aiM] [MI={0};

    /***************found*******************/

    fun( int **a, int m)

    {int j,k;

    for (j=0; j<m; j++)

    for (k=0; k<m; k++)

    /***************found*******************/

    a[j] [k]=k*j;

    }

    main ( )

    {int i, j, n;

    clrscr ();

    printf ("Enter n\n"); scanf ("%d", &n);

    fun (a, n);

    for (i=0; i<n; i++)

    { for (j=0;j<n;j++)

    printf ("%4d ",a[i] [j]);

    printf ("\n ");

    }

    }


    正确答案:(1)错误:fun(int**a int m) 正确:void fun(int(*a)[M]int m) (2)错误:a[j][k]=k*j; 正确:a[j][k]=(k+1)*(j+1);
    (1)错误:fun(int**a, int m) 正确:void fun(int(*a)[M],int m) (2)错误:a[j][k]=k*j; 正确:a[j][k]=(k+1)*(j+1); 解析:对于二维数组,应该理解成为是由几个一维数组作元素组成的一维数组,或者说,二维数组实际是一个一维数组,只不过它的每个数组元素又都是一个一维数组。我们先来看看指针数组的表示形式:
    (1)p+i和a+i均表示a[i]的地址,或者讲,它们均指向数组第i号元素,即指向a[i]。
    (2)*(p+i)和*(a+i)都表示p+i和a+i所指对象的内容,即为a[i]。
    (3)指向数组元素的指针,也可以表示成数组的形式,也就是说,它允许指针变量带下标,如p[i]与*(p+i)等价。因此,二维数组元素a[i][j]可表示成*(a[i]+j)或*(*(a+i)+j),它们都与a[i][j]等价,或者还可写成(*(a+i))[j]。了解了以上这些内容后本题就好解决了。

  • 第15题:

    阅读以下说明和C语言程序,将应填入(n)处的字句写在对应栏内。

    【说明】

    计算n的合数。一个整数n可以有多种划分,使其划分的一列整数之和为n。例如,整数5的划分为:

    5

    4 1

    3 2

    3 1 1

    2 2 1

    2 1 1 1

    1 1 1 1 1

    共有7种划分。这种划分的程序如下所示。

    【程序】

    include <stdio.h>

    int n[1000],m,k;

    void output sum()

    {

    int j;

    for(j=0;n[j]!=0;j++)

    printf("%d\t",n[j]);

    printf("\n");

    }

    void sum(int i)

    if(m-n[i]<n[i])

    { m=m-n[i];

    (1)

    i++;

    n[i+1]=0;

    }

    else

    {

    (2)

    m-=n[i];

    i++;

    }

    if(m!=n[i])

    sum(i);

    else

    output_sum();

    if(n[i]>1)

    {

    n[i]--;

    (3)

    }

    else

    {

    while((n[i]==1)&&(i>O))

    {

    i--;

    (4)

    }

    if(i!=0)

    {

    (5)

    sum(i);

    }

    }

    }

    void main()

    {

    int i;

    scanf("%d",&n[0]);

    m=k=n[0];

    for(i=1;i<=k;i++)

    n[i]=0;

    while(n[0]!=1)

    {

    n[0]--;

    i=0;

    sum(0);

    m=k;

    }

    }


    正确答案:(1)n[i+1]=m; (2)n[i+1]=n[i]; (3)sum(i); (4) m+=n[i]; (5)n[i]--;
    (1)n[i+1]=m; (2)n[i+1]=n[i]; (3)sum(i); (4) m+=n[i]; (5)n[i]--; 解析:本题考查C语言中计算n合数方法的实现。
    题目要求计算n的合数,我们首先来了解一下什么是n的合数。在正整数n的所有不同的划分中,将最大加数n1不大于m的划分个数记作q(n,m)。可以建立q(n,m)的如下递推关系。
    (1)q(n,1)=1,n1
    当最大数n1不大于1时,任何正整数只有一种划分形式,就是全1。
    (2)q(n,m)=q(n,n),mn
    最大加数n1实际上不能大于n。因此,q(1,m)=1。
    (3)q(n,n)=1+q(n,n-1)
    正整数n的划分由n1=n的划分和n1≤n-1的划分组成。
    (4)q(n,m)=q(n,m-1)+q(n-m,m),n>m>1
    正整数n的最大加数n1不大于m的划分由n1=m的划分和n1≤m-1的划分组成。要想求出所有解,只有递归到最底层即全为1为止。
    知道了上述特性,下面我们来看代码。在代码中首先声明一个数组和两个全局变量 k,m。结合程序可以看出,其中数组n[i]中存放的是当前划分的最大加数,而m中存放的是当前被划分的数。程序代码中有三个函数,一个是主函数、一个output_sum()函数和一个sum()函数,函数output_sum()的功能很简单,就是输出一次划分结果,在sum()函数中被调用。
    经过分析不难发现,函数sum()的作用是实现整数的划分。在函数体中,首先是一个条件判断语句,其作用是判断当前被划分的数m是否小于当前最大加数的两倍,如果条件成立,说明数被划分为两个数后,其最大加数大于另一个数,而另一个数应该存放在数组中。此时执行语句m=m-n[i]来求出另一个数,接下来应该是保存这个数到数组中的下个位置,第(1)空就用来完成这个任务,因此,答案为n[i+1]=m。
    第(2)空所在的位置是条件不成立的情况下运行的语句,条件不成立,说明数被划分为两个数后,其最大加数小于另一个数,数可以有更大的最大加数,因此,将当前的最大加数保存到数组中的下个位置,此空答案为n[i+1]=n[i]。
    第(3)空也在一个条件选择语句下面,此条件语句用于判断当前最大加数是否大于1,如果大于1,则需要接着划分,因此要调用函数sum(),其参数是i,所以此空答案为sum(i)。
    第(4)空是条件不成立即当前最大加数为1的情况下执行的语句,当最大加数为1时,说明递归到了最底层,此时,递归应该往回走了,这需要还原当前最大划分数m(为这个数的其他划分做准备),因此,这个空的答案为m+=n[i]。
    第(5)空是在条件i!=0为真的情况下执行的语句,如果条件为真,说明递归还没有回到最上层,应该求当前被划分数在当前最大加数变小后的其他划分情况,因此,此空答案为n[i]--。

  • 第16题:

    分析下列程序,其最终执行结果是______。 main() { int n[3],i,j,k; for(i=0;i<3;i++)n[i]=O; k=2; for(i=0;i<k;i++) for(j=0;j<k;j++) n[j]=n[i]-1; printf("%d\n",n[0]); }

    A.-2

    B.-1

    C.0

    D.-3


    正确答案:D
    解析:当i为0,内循环在j为0时,执行n[j]=n[i]-1;,即n[0]=n[0]-1, n[0]值变为-1:在j为1时,执行n[j]=n[i]-1;,即n[1]=n[0]-1,将-2赋给n[1]。当i为1时,内循环在j为0时,执行n[j]=n[i]-1;,即n[0]=n[1]-1,n[0]值变为-3;在j为1时,执行n[j]=n[i]-1;,即n[1]=n[1]-1,将-3赋给n[1];最后n[0]和n[1]的值均为-3。

  • 第17题:

    下面程序段的时间复杂度是(9)。for(i=0,k=0;<n;1++){ k+=A[i][j]; for(j=1;j<m;j++) A[i][j]=1}

    A.O(n)

    B.O(m+n+1)

    C.O(m+n)

    D.O(m*n)


    正确答案:D
    解析:时间复杂度是解决问题的时间和问题的规模之间的关系,即解决问题所耗费的时间随问题规模增长成怎样的增长对应关系。本题中最内部的循环的执行次数为m*n,所以整段程序的复杂度为O(m*n)。

  • 第18题:

    以下程序的输出结果是#include <conio.h>#include <stdio.h>#define M 100void fun(int m, int *a, int *n){ int i,j=0; for(i=1;i<=m;i++) if(i%7==0||i%11==0) a[j++]=i; *n=j;}main(){ int aa[M],n,k; clrscr(); fun(100,aa,&n); for(k=0;k<n;k++) if((k+1)%20==0)printf("\n"); else printf("%d",aa[k]); printf("\n"); }


    正确答案:77
    在本题中,程序首先定义一个宏M,然后定义一个fun函数,函数带有三个形参,分别是一个整型形参m和两个整型指针形参a、n。在函数体中,首先定义两整型变量i和j,并给j赋初值为0,然后执行循环,循环体中首先是一个条件判断语句,如果结果为真,则说明变量i能同时被7和11整除,并将变量i保存到数组中,循环结束后,将数组中元素的个数通过指针变量n进行返回。通过分析可以知道,fun函数的作用是求取1到m中能同时被7和11整除的整数,并将结果保存到数组a中。
    在主函数中,首先定义了两个整型变量和一个整型数组aa,然后调用clrscr()函数对文本模式窗口进行清除操作。接着调用fun函数,根据上面我们对fun函数的分析,要计算1~100之间能同时被7和11整除的整数,很显然,这样的数只有77一个,那么此时数组aa中只有一个元素为77,而n的值是1。
    接着执行for循环,从程序中不难看出循环的作用是将数组aa中的元素按一定的规则输出,其规则为每行最多只能输出20个值。结合上面的分析,数组aa中只有一个元素为77,因此,本题程序的最终输出结果为77。

  • 第19题:

    已知有一维数组A(0..m*n-1],若要对应为m行、n列的矩阵,则下面的对应关系(4)可将元素A[k](0≤k<m*n)表示成矩阵的第i行、第j列的元素(0≤i<m,0≤j<n)。

    A.i=k/n,j=k%m

    B.i=k/m,j=K%m

    C.i=k/n,j=k%n

    D.i=k/m,j=k%n


    正确答案:C
    解析:此题是求一维数组向二维数组转化的问题。最原始的方法就是把数组A的前n个元素放到数组B的第一行,数组A的第n个元素放到数组B的第二行中,依次类推,数组A的最后n个元素放到数组B的最后一行中。求且[幻在数组B中的位置,应先确定A[k]处在哪一行,显然应该是k/n行,然后再确定处在k/n行的哪一列,显然是k%n列。

  • 第20题:

    下面程序的功能是 : 将 N 行 N 列二维数组中每一行的元素进行排序 , 第 0 行从小到大排序 , 第 1 行从大到小排序,第 2 行从小到大排序,第 3 行从大到小排序,例如:

    define N 4

    void sort(int a[][N])

    { int i, j, k, t;

    for (i=0; i<N;i++)

    for (j=0; j<N-1:j++)

    for (k= 【 13 】 ; k<N;K++)

    /* 判断行下标是否为偶数来确定按升序或降序来排序 */

    if ( 【 14 】 ? a[i][j]<a[i][k]); a[i][j]>a[i][k])

    { t = a[i][j];

    a[i][j]=a[i][k];

    a[i][k] = t;

    }

    }

    void outarr(int a[N][N])

    { …… }

    main()

    { int aa[N][N]={{2,3,4,1},{8,6,5,7},{11,12,10,9},{15,14,16,13}};

    outarr(aa); /* 以矩阵的形式输出二维数组 */

    sort(aa);

    outarr(aa);

    }


    正确答案:
    答案j+1;i%2或i%2==1解析:k表示i行中从第j个元素之后的元素的列小标;判断第i行是否是偶数

  • 第21题:

    阅读以下函数说明和C语言函数,将应填入(n)处的字句写在对应栏内。

    [说明]

    函数int psort(int a[],int n)实现将含n个整数的数组a[]的不同元素按从小到大顺序存于数组a[]中。实现方法是从未确定的元素列中找到最小元素并将a[]的第i最小元素交换至a[i]位置。如该最小元素比已确定的最后一个最小元素大,则将它接在已确定的元素序列的后面;否则,忽视该元素。

    [C函数]

    int psort(int a[],int n)

    {int i,J,k,P;

    for(i=0,k=0;i<(1);i++){

    for(j=i+1, (2) ;j<n; j++)

    if(a[p]>a[j])

    p=j;

    if(p!=i){

    t=a[p];

    a[p]=a[i];

    a[i]=t;

    }

    if( (3) ) k++;

    else if( (4) <a[i])

    (5)=a[i];

    }

    return k;

    }

    int a[]={5,7,5,6,4,3,4,6,7};

    main()

    {int k,n;

    for(k=0;k<(Sizeof a)/Sizeof(int);k++)

    printf("%5d",a[k]);

    printf ("\n\n");

    n=psort(a,(sizeof(a))/sizeof(int));

    for(k=0;k<n;k++)

    printf("%5d",a[k]);

    printf("\n\n");

    }


    正确答案:(1) n-1 (2) P=i (3) k==0 (4) a[k-1] (5) a[k++]
    (1) n-1 (2) P=i (3) k==0 (4) a[k-1] (5) a[k++] 解析:本程序排序方法是从未确定的元素列中找到最小元素并将a[]的第i最小元素交换至a[i]位置。如该最小元素比已确定的最后一个最小元素大,则将它接在已确定的元素序列的后面;否则,忽视该元素。这是采用选择法对数组元素进行排序,因此空(1)填“n-1”,空(2)填“p=i”。若该最小元素比已确定的最后一个最小元素大,则将它接在已确定的元素序列的后面;否则,忽视该元素。因此,空(3)填“k==0”;而当a[k-1]a[i]时”,则a[k++]=a[i];否则忽略元素a[i]。所以空(4)填“a[k-1]”空(5)填“a[k++]”。

  • 第22题:

    下面的子程序求一方阵的次对角线上的元素之和。
    SUBROUTINE CDJX(M,N,K)
    DIMENSION M(N,50)
    DO 10 J = 1,N
    K=_
    10 CONTINUE RETURN END
    为了使程序完整,应在_处填入的是:

    A.K+M(J,J)
    B.K+M(J,N+1—J)
    C. K+M(N+J,J)
    D. K+M(N+J,N-J)

    答案:B
    解析:
    (1)方阵是行和列数目相等的矩阵,方阵次对角线指从左下角到右上角的直线。
    (2)N值是由主程序调用子例行子程序时传递过来的。
    (3)子例行子程序定义的两维数组下标上界最大为50。
    (4)方阵的行和列由传递过来的N值决定。
    (5)可以设置N=5,有下列25个数组元素:

  • 第23题:

    下列程序段的时间复杂度为()。for(i=0;i<m;i++)for(j=0;j<t;j++)e[i][j]=0;for(i=0;i<m;i++)for(j=0;j<t;j++)for(k=0;k<n;k++)c[i][j]_c[i][j]+a[i][k]×b[k][j];

    A.O(m×n×t)
    B.O(m+n+t)
    C.O(m×t+n)
    D.O(m+n×t)

    答案:A
    解析:
    在程序段中,有两段循环程序,第一段是一个双层嵌套循环,另一个是三层嵌套循环,所以基本操作是c[i][j]=c[i][j]+a[i][k]×b[k][j],此基本操作共执行m×t×n次。