itgle.com

假设sqrt(n)函数中涉及的算法时间复杂度为O(1),那么下面的算法是判断n是否为素数,其时间复杂度为()。 void prime(int n) { for (i=2; i<sqrt(n) && (n % i)!=0; i++) ; if (i>sqrt(n)) printf("%d is a prime number", n); else printf("%d is not a prime number", n); }A.O(n)B.O(1)C.O(sqrt(n)) sqrt表示对n取根方D.O(n-

题目

假设sqrt(n)函数中涉及的算法时间复杂度为O(1),那么下面的算法是判断n是否为素数,其时间复杂度为()。 void prime(int n) { for (i=2; i<sqrt(n) && (n % i)!=0; i++) ; if (i>sqrt(n)) printf("%d is a prime number", n); else printf("%d is not a prime number", n); }

A.O(n)

B.O(1)

C.O(sqrt(n)) sqrt表示对n取根方

D.O(n-i)


相似考题
更多“假设sqrt(n)函数中涉及的算法时间复杂度为O(1),那么下面的算法是判断n是否为素数,其时间复杂度为()。 void prime(int n) { for (i=2; i<sqrt(n) && (n % i)!=0; i++) ; if (i>sqrt(n)) printf("%d is a prime number", n); else printf("%d is not a prime number", n); }”相关问题
  • 第1题:

    (28)以下函数按每行8个输出数组中的数据

    void fun( int *w,int n)

    { int i;

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

    {________

    printf(“%d”,w);

    }

    printf(“\n”);

    }

    下划线处应填入的语句是

    A)if(i/8==0)print(“\n”); B) if(i/8==0)continue;

    C) if(i%8==0)print(“\n”); D) if(i%8==0)continue;


    正确答案:C

  • 第2题:

    下列给定程序的功能是:读入一个整数n(2<=n<= 5000),打印它的所有为素数的因子。例如,若输入整数1234,则应输出:2,617。 请修改程序中的错误,使程序能得出正确的结果。 注意:不要改动main函数,不能增选或删行,也不能匿改程序的结构。 试题程序: include<conio.h> include<stdio.h> //****found**** Prime(int m); { int j,P; p=1; //****found**** for(j=2;j<m;j++) if!(m%j) { p=0; break; } return(p);

    int i,n; printf("\nplease enter an integer number between2 and 5000:"); scanf("%d",&n); printf("\n\nThe prime factor(s)of%d is(are):",n): for(i=2;i<n;i4+) if((!(n%i))&&(Prime(i))) printf("%4d,",i); printf("\n"); }


    正确答案:

    (1)错误:Prime(int m);
    正确:Prime(int m)
    (2)错误:if(!(m%j)
    正确:if(!(m%j))
    【解析】(1)第一个标识下面的“Prime(int m);”在程序中显然是一个函数,因此应将后面的分号去掉。
    (2)第二个标识下面的for语句最简单的应用形式为:for(循环变量赋初值;循环条件;循环变量增值)语句。显然if语句后面缺少括号,因此,“if!(m%j)”改为“if(!(m%i))”。
    本题主要考查标点符号、运算符、基本定义。

  • 第3题:

    下列程序段的时间复杂度为()。i=0,s=0;while(sn){s=s+i;i++;}

    A、O(n1/2)

    B、O(n1/3)

    C、O(n)

    D、O(n2)


    参考答案:A

  • 第4题:

    有以下函数

    void prt(char ch,int n)

    {int i;

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

    printf(i%6 !=O?“%c”:“%c\n”,ch);

    }

    执行调用语句prt(’*’,24);后,函数共输出 行*号。


    正确答案:4
    4

  • 第5题:

    请补充函数fun(),该函数的功能是:按行统计N×N维矩阵元素中的最大值(均为整数),并把这些值按从小到大的顺序保存在数组b中。矩阵的维数在主函数中输入,并赋予随机数。

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

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

    试题程序:

    include<stdio.h>

    include<conio.h>

    include<stdlib.h>

    define N 20

    void fun(【 】)

    {

    int i j;

    int t;

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

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

    if(【 】)

    b[i]=a[i][j];

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

    {

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

    if(【 】)

    {

    t=b[i];

    b[i]=b[j];

    b[j]=t;

    }

    }

    }

    main()

    {

    int a[N][N];

    int b[N];

    int n;

    int i,j;

    clrscr();

    printf("*****Input the dimension of array N*****\n");

    scanf("%d",&n);

    printf("*****The array *****\n");

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

    {

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

    {

    a[i][j]=rand()%20;

    while(a[i][j]==0)

    a[i][j]=rand()%30;

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

    }

    printf(”\n\n”);

    }

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

    b[i]=0;

    fun(a,b,n);

    printf("***** THE RESULT *****\n");

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

    printf(“%d”,b[i]);

    }


    正确答案:int a[][N]int b[]int n b[i]a[i][j] b[i]b[j]
    int a[][N],int b[],int n b[i]a[i][j] b[i]b[j] 解析:第一空:根据主函数main()调用函数fun()的格式,可以知道函数fun()有3个参数,第一个参数是N×N整型二维数组,第二个参数是整型—维数组,第三个参数是整型变量。第二空:数组元素b[i]保存第i行的最大值,通过循环将第i行的各元素与b[i]进行比较,如果大于b[i],则将这个数赋给b[i].第三空:通过for循环嵌套,将数组b中的数按从小到大的顺序排列,依次将各元素与所有元素进行比较,如果有一个元素比当前元素大,就借助第三个变量交换这两个元素,最终使第一个元素保存数组中最小的数,最后一个元素保存数组中最大的数。

  • 第6题:

    下面算法是实现对n个整数的序列进行选择排序,其中序列的“长度”n为问题的规模。该算法的时间复杂度为(11)。 void select_sort(int a[],int n){ //将a中整数序列重新排列成从小到大有序的整数序列 for(i=0;i<n-1;++i){ j=i; for(k=i+1;k<n;++k)if(a[k]<a[j])j=k; if(j!=i){w=a[j];a[j];a[i];a[i]=w} )//select_sort

    A.O(n2)

    B.O(n3)

    C.O(n4)

    D.O(n)


    正确答案:A
    解析:算法中的控制结构是两重循环,所以基本操作是在内层循环中的“比较”,它的重复执行次数是:对时间复杂度而言,只需要取最高项,并忽略常数系数。

  • 第7题:

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

    【说明】

    有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数。

    【函数】

    main()

    {

    int number[20],n,m,i;

    printf("the total numbers is:");

    scanf("%d",&n);

    printf("back m:");

    scanf("%d",&m);

    for(i=0;i<=n-1;i)

    scanf("%d,",&number[i]);

    (1);

    for(i=0;i<=n-1;i)

    printf("%d,",number[i]);

    }

    move(array,n,m)

    int n,m,array[20];

    {

    int *p,array_end;

    array_end=(2);

    for(p=array[n-1];(3);p--)

    *p=(4);

    *array=array_end;

    m--;

    if(m>0) (5);

    }


    正确答案:(1)move(numbernm) (2)*(array[n-1]) (3)p>array (4)*(p-1) (5)move(arraynm)
    (1)move(number,n,m) (2)*(array[n-1]) (3)p>array (4)*(p-1) (5)move(array,n,m) 解析:本题考查数字顺序移动和数组的相关知识。
    从数据结构的角度出发,数字在数组中顺序移动,就是将数字一个一个往后搬,例如,将n-1位置的数字移到n位置,然后再把n-2位置的数字移到n-1位置,其实这是一个简单的数字移动。我们只需要取出第n个位置的数字并保存在一个临时变量中,然后,其他的就按顺序依次移动即可,直到一次整体移动完成,我们再从临时变量中取回数字并将其放在数组的第一个位置中。重复这个过程m次,整个数组就往后移动了m个位置。
    首先,我们来看一下主函数,在主函数里面声明了一个容量为20的整型数组 number[20]和其余3个整型变量,数组用来存储我们输入的待处理的数,而变量m、n分别用于存放我们要移动位置的个数和输入整数的个数。第一个循环语句用于n个整数的输入,第二个循环语句用于n个整数的输出,在这中间应该还有一个处理来完成将n个整数顺序向后移m个位置,并让最后m个数变成最前面的m个数这个功能,从下面的程序段我们知道,这里是调用函数muve(number,n,m)来完成的。因此,第(1)空填 move(nurnber,n,m),在调用时我们需要注意参数的传递。
    再来看move(array,n,m)函数,在此函数中,同样声明了一个容量为20的整型数组和 2个整型变量,另外还声明了一个指针变量p。由*array=array_end,结合第(2)空来看,这里是把数组中最后位置的数取出存放在array_end变量当中。因此,第(2)空应填 *(array[n-1])。
    第(3)空是常见的在循环语句中表示判断的语句,由于“p=array[n-1]”把数组最末的地址赋给了指针p,只要p的值大于数组的起始地址循环就可以继续,因此,第(3)空应填p>array。
    第(4)空要完成的任务是将数字后移,因此,第(4)空为*p-1。从程序来分析,数组每移动完成一次,m的值就减一,而现在只有移动m次的功能没有实现,因此,只要m值大于0,就调用函数自身来实现再次移动。因此,第(5)空填写move(array,n,m)进行递归调用。

  • 第8题:

    以下函数按每珩8个输出数组中的数据 void fun( iht*w, int n) { inti; for(i=0;i<n,i++) { ______ printf("%d",w[i]); } printf("\n"); } 下划线处应填入的语句是______。

    A.if(i/8=0)printf("\n);

    B.if(i/8=0)continue;

    C.if(i%8=0)printf("\n");

    D.if(i%8=0)continue;


    正确答案:C
    解析:本题主要考查输出换行的问题,要求每行8个输出,因此,下划线处应填的语句是if(i%8=0)printf("\n");选项A相当于空—行,前七个数每输出—个数换行,从第八个数以后不换行输出剩下的数。选项B相当于前八个数不输出,从第九个数开始不换行输出剩下的数。选项D相当于不换行从数组中的第二个数开始输出,凡是i对8取模为0的数,均不输出。所以选项C是正确的。

  • 第9题:

    有以下程序 include void fun(int a[],int n) { int i,t; for(i=0;

    有以下程序 #include <stdio.h> void fun(int a[],int n) { int i,t; for(i=0;i<n/2;i++) {t=a[i]; a[i]=a[n-1-i]; a[n-1-i]=t;} } main() {int k[10]={1,2,3,4,5,6,7,8,9,10},i; fun(k,5); for(i=2;i<8;i++) printf("%d",k[i]); printf("\n"); } 程序的运行结果是______。

    A.345678

    B.876543

    C.1098765

    D.321678


    正确答案:D
    解析:在主函数中,定义了一维数组k,并通过调用fun函数将形参数组a指向实参数组k所在的存储单元,这样,a和 k共用同一存储单元,所以对数组a的元素值的改变相当于对相应数组k的元素值的改变。在fun函数中,通过for循环对数组元素a[0]与a[4]、a[1]与a[3]的值分别作了交换,也即相当于主函数中k[0]与k[4]、k[1]与k[3]的值分别作了交换,此时k中各元素的值为5,4,3,2,1,6,7,8,9,10,故输出k[2]到k[7]的值为321678。

  • 第10题:

    请补充main函数,该函数的功能是:把1~100间的所有素数保存在数组aa中,然后输出这些素数并计算它们的和。

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

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

    试题程序:

    include<stdio.h>

    main()

    {

    int n, i, j, k, flag, sum;

    int aa [50];

    sum=O;

    k=O;

    clrscr ();

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

    {

    【 】;

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

    if (i%j==O)

    {

    【 】;

    }

    if (flag)

    {

    sum+=i;

    【 】;

    }

    }

    printf("\n*** prime number ***\n");

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

    {

    if (i%10==0)

    printf ("\n");

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

    }

    printf ("\nsum=%d", sum);

    }


    正确答案:flag=1 flag=0 aa[k+++]=i
    flag=1 flag=0 aa[k+++]=i 解析:第一空:由后面的if句可以看出,当nag为1时,当前数是素数,所以此处先假设当前数为素数,即置flag为1,再进行判断,如果不是素数,则再将fflag清零。第二空:如果一个数能被除了1和其自身之外的数整除,即余数为0,则这个数不是素数。如果当前数不是素数,则将flag清零。第三空:如果当前数是素数,则将它保存在数组bb中。

  • 第11题:

    请补充main函数,该函数的功能是:输出一个N×N矩阵,要求非对角线上的元素赋值为0,对角线元素赋值为1。

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

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

    试题程序:

    include<stdio. h>

    define N 10

    main ( )

    {

    int bb[N] [N];

    int i, j,n;

    clrscr ();

    printf (" \nInput n:\n");

    scanf ("%d", &n);

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

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

    {

    【 】;

    if (i==j)

    bb[i] [j]=【 】;

    if (【 】)

    bb[i] [j]=1;

    }

    printf(" \n***** the result ***** \n");

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

    {

    printf (" \n\n");

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

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

    }

    }


    正确答案:bb[i][j]=0 1 j==n-1-i
    bb[i][j]=0 1 j==n-1-i 解析:第一空:本题的解题思路是先将所有元素都置0,然后再将对角线上的元素置1。所以此空是先将当前元素置0。
    第二空:如果当前元素的下标i和j相等,则此元素是主对角线元素,要将它赋值为1。第三空:如果当前元素的下标i和j满足关j==n-1-i,则此元素也是对角线元素,也要将它赋值为1。

  • 第12题:

    算法的主要运算如下: While i<n do { s=0; While s<n do { s=s+1; } i=i+1; } 其中i的初值为0,s初值为0,“=”为赋值号。该算法的时间复杂度为()

    A.O(2n)

    B.O(n+log2n)

    C.O(nlog2n)

    D.O(n2)


    正确答案:D
    解析:程序中有两个嵌套的n循环,故时间复杂度为O(n2)。

  • 第13题:

    以下程序运行后的输出结果是【9】。

    include<stdio.h>

    main()

    { int i,n[]={0,0,0,0,0};

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

    { n[i]=n[i-1]*3+1;

    printf("%d",n[i]);

    }

    printf("\n");

    }


    正确答案:14
    14 解析:考察for循环的基础知识,当i=1时,a[1]为1,输出为1,当i=2时,a[2]为1*3+1=4,所以输出为4,最终输出为14。

  • 第14题:

    该程序运行的结果是( )。

    #include

    #include

    #define M 100

    void fun(int m, int *a, int *n)

    { int i,j=0;

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

    if(i%7==0||i==0)

    a[j++]=i;

    *n=j;}

    main()

    { int aa[M],n,k;

    clrscr();

    fun(10,aa,&n);

    for(k=0;k

    if((k+1) ==0)printf("\n");

    else printf("M",aa[k]);

    printf("\n");}


    正确答案:
    7

  • 第15题:

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

    【函数2.1说明】

    有1、2、3、4四个数字,输出由这些数字组成的互不相同且无重、复数字的三位数。

    【函数2.1】

    main()

    {

    int i,j,k;

    printf("\n");

    for((1)) /*以下为三重循环*/

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

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

    {

    if ((2)) /*确保i, j, k 三位互不相同*/

    printf("%d,%d,%d\n",i,j,k);

    }

    }

    【函数2.2说明】

    计算并输出100之内的素数,每行输出10个,超过10个则换行。

    【函数2.2】

    include <stdio.h>

    include "math.h"

    define N 101

    main()

    {

    int i,j,line,a[N];

    for(i=2;i<N;i++)(3);

    for(i=2;i<sqrt(N);i++)

    for(j=i+1;j<N;j++)

    {

    if(a[i]!=0&&a[j]!=0)

    if(a[j]%a[i]==0)

    (4);

    }

    printfC\n");

    for(i=2,line=0;i<N;i++)

    {

    if(a[i]!=0)

    {

    prinff("%5d",a[i]);

    (5);

    }

    if(line==10)

    {

    prinff("\n");

    line=0;

    }

    }

    }


    正确答案:(1)i=1;i5;i++ (2)i!=k&&i!=j&&j!=k (3)a[i]=I (4)a[j]=0 (5)line++
    (1)i=1;i5;i++ (2)i!=k&&i!=j&&j!=k (3)a[i]=I (4)a[j]=0 (5)line++ 解析:本题考查用C语言程序对组合数和素数的求解。
    在函数2.1中,要求输出由1、2、3、4这些数字组成的互不相同且无重复数字的三位数。程序中是用三重循环来实现的。
    第(1)空是三重循环中第一重循环的循环条件,三位数的最高位可以取题目给出的任意一个数,那么应该和其他循环的条件一样,结合程序中变量的应用情况,不难知道这重循环是用变量i,因此,此空答案为i=1;i5;i++。
    第(2)空是条件判断语句的条件,此条件判断语句的作用注释中已经给出,是用来确保i,j,k三位互不相同的,即所组成的三位数中无重复数字。因此,此空答案为i!=k&&i!=j&&j!=k。
    在函数2.2中,题目要求计算并输出100之内的素数,且每行只能输出10个数,从试题一中我们应该很清楚素数的定义了,最小的素数是2。下面我们来分析程序。
    第(3)空是第一个循环下面的执行语句,此循环是从2开始一直到100,结合程序不难发现程序中用了一个数组来存放要参加运算的100个数,但是并没有对数组进行赋初值操作,那么此空的作用应该就是对数组进行赋初值,因此,此空答案为a[i]=i。
    第(4)空是在循环中的两个条件判断语句下面,从条件判断语句if(a[j]%a[i]==0)不难推断出此循环是用来求当前最小素数的倍数的,此空是对当前最小素数倍数的处理,结合后面的程序可以知道,如果是素数的倍数,那么在数组中的值要被变为0,因此,此空答案为a[j]=0。
    第(5)空是在循环输出语句下面,从条件判断语句if(line==10)及下面的操作可以推断出变量line是用来记录一行中输出素数的个数的,在此空的上面一行程序是输出一个素数,那么接下来应该是将变量line加1,因此,此空答案为line++。

  • 第16题:

    假如整数数列中的数不重复,并存放在数组中。下列给定的程序中,函数fun()的功能是:删除数列中值为X的元素。 N中存放的是数列中元素的个数。

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

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

    试题程序:

    include<stdio.h>

    define N 20

    fun (int *a,int n,int x)

    {int p=0,i;

    a[n]=x;

    while (x!=a[p])

    p=p+1;

    if(p==n) return -1;

    else

    {for (i=p;i<n;i++)

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

    a[i+1]=a[i];

    return n-1;

    }

    }

    main()

    {int w[N]={-3,0,1,5,7,99,10,15,30,90},

    x,n,i;

    n=10;

    printf("The original data :\n");

    for (i=0;i<n;i++) printf("%5d",w[i]);

    printf("\nInput x (to delete ): ");

    scanf("%d",&x);

    printf("Delete : %d\n",x);

    n=fun(w,n,x);

    if (n==-1) printf("***No be found!

    ***\n\n");

    else

    {printf("The data after deleted:\n");

    for (i=0;i<n;i++) printf("%5d",

    w[i]);printf("\n\n");

    }

    }


    正确答案:错误:a[i+1]=a[i]; 正确:a[i]=a[i+1];
    错误:a[i+1]=a[i]; 正确:a[i]=a[i+1]; 解析:上机改错题有一个优势,就是我们可以执行该程序,根据错误的提示再一步一步实现改错的目的,我们先不看程序是什么意思,甚至不用看它在求什么。按Ctrl+F9快捷键,然后看看屏幕提示。另外,审题时我们必须要注意“不要改动main()函数,不得增行或减行,也不得更改程序结构”,这样;对我们来说,只要读懂题意,对程序执行部分:
    {int p=0,i;
    a[n]=x;
    while (x!=a[p])
    p=p+1;
    if (p==n) return -1;
    else
    { for (i=p;in;i++)
    a[i+1]=a[i];
    return n-1;
    }
    逐步分析,再应用平时的常识加以区分,琢磨,相信答案不攻自破,这种考题,按Ctrl+F9快捷键后,屏幕一般都不会提示错误,否则就显得太儿科了一点,所以,我们并不需要着急去找错误,而是把程序读懂。

  • 第17题:

    以下程序运行后的输出结果是 。

    include

    main()

    {int i,n[5]={0};

    for(i=l;i<=4;i++)

    {n[i]=n[i-1]*2+1;printf(“%d”,n[i])}

    printf(“\n”):

    }


    正确答案:137l5
    137l5

  • 第18题:

    算法的主运算如下,其中i的初值为1,s的初值为0,“←”为赋值号。 while i<n do { for j←1 to n do s←s+a[i,j] i←i*2; 则该算法的时间复杂度为 ( )

    A.O(2n)

    B.O(n+log2n)

    C.O(nlog2n)

    D.O(n2)


    正确答案:C

  • 第19题:

    阅读以下说明和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]--。

  • 第20题:

    分析下列程序,其最终执行结果是______。 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。

  • 第21题:

    若变量n中的值为24,则print()函数共输出行,最后一行有个数。void print (int n,int aa[]){ int i; for(i=1; i<1;i++) { printf("%6d",aa[i]); if(!(i%5)) printf("\n"); } printf ("\n");}


    正确答案:5,4
    语句if(!(i%))printf("\n");是将每5个数输出一行,因为n的值为24,所以共输出5行,最后一行有4个数。

  • 第22题:

    以下程序的输出结果是#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。

  • 第23题:

    有以下程序: #include<stdio.h> #define N 4 void fun(int a[][N],int[]) { int i; for(i=o;i<N;i++)b[i]=a[i][i]-a[i][N-1-i-]}; } main( ) { int x[N][N]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}},y[N],i; fun(X,y); for(i=0;i<N;i++)printf("%d,",y[i]);printf("\n"); } 程序运行结果为( )。

    A.-l2,-3,0,0,

    B.-3,-l,1,3,

    C.0,1,2,3,

    D.-3,-3,-3,-3,


    正确答案:B
    此题考查函数的调用以及数组的用法,由函数fun可知,当i=0,i<N且N=4,执行i++和b[i]=a[i][i]-a[i][N-1-i],经过运算得出结果为-3,-l,1,3。

  • 第24题:

    设S为C语言的语句,计算机执行下面算法时,算法的时间复杂度为()。for(i=n-1;i>=0;i--)for(j=0;j

    • A、n2
    • B、O(nlgn)
    • C、O(n)
    • D、O(n2)

    正确答案:D