一起答
主观

  阅读以下说明和C程序,填充程序中的空缺,将解答填入答题纸的对应栏内。

【说明】

    正整数n若是其平方数的尾部,则称n为同构数。例如,6是其平方数36的尾部,

76是其平方数5776的尾部,6与76都是同构数。下面的程序求解不超过10000的所有

同构数。

    已知一位的同构数有三个:1,5,6,因此二位同构数的个位数字只可能是1,5,6

这三个数字。依此类推,更高位数同构数的个位数字也只可能是1,5,6这三个数字。

    下面程序的处理思路是:对不超过100 00的每一个整数a,判断其个位数字,若为1、

5或6,则将a转换为字符串as,然后对a进行平方运算,并截取其尾部与as长度相等

的若干字符形成字符串后与as比较,根据它们相等与否来断定a是否为同构数。

【C程序】

#include

#include

#include

int myitoa (int,  char*);    ,/*将整数转换为字符串*/

/* right取得指定字符串尾部长度为ler gth的子串,返回所得子串的首字符指针*/

char *right (char*,  int  length);

int main ()

{

    int  a, t;        int  len;

   char as [10],  rs[20];

printf(”[1,10000]内的同构数:\r”);

for (a=l.a<=10000; a++)    {

  t=  (1);    /*取整数a的个位数字*/

  if (t!=l&&t!=5&&t!=6)  :ontinue;

  len=myitoa (a, as)j    /*数a转换为字符串,存入as*/

  myitoa (a*a, rs);    /*数a的平方转换为字符串,存入rs*/

/*比较字符串as与rs末尾长度为len的子争是否相等*/

    if(strcmp(as,__(2)  )**o)    /*若相同则是同构数并输出*/

    printf(“%s的平方为%s\n”,as,rs);

  }

  return O;

}

int  myitoa (int num,char*s)    /*将整数num转换为字符串存入s*/

{

    int i,n=0;

    char ch;

/*从个位数开始,取num的每一位数字转换为字符后放入s[]*/

    while (num)  {

    s[n++]  =(3)    +’o';

    num=num/10.

  }

  s[n]=’\0 ‘;

    for (i=0;  i

    (4)  ;  s[i]=  s [n-i-l];s[n-i-1]=ch;

}

return n;    /*返回输入参数num的位数*/

}

char *right (char*ms,  int  length)

/*取字符串ms尾部长度为length的子串,返回所得子串的首字符指针*/

{

int i;

For(;*ms;ms++)    /*使ms到达原字符串的尾部*/

for( i=0;  i

return ms;

}

试题出自试卷《2013年下半年程序员下午真题试题分析与解答》
参考答案
查看试卷详情
相关试题
  1.   阅读以下说明和C++代码,填充代码中的空缺,将解答填入答题纸的对应栏内。

    【说明】

        某应急交通控制系统(TraficControISy ,tem)在红灯时控制各类车辆(Vehicle)的通

    行,其类图如图5-1所示,在紧急状态下应急车辆红灯时也可通行,其余车辆按正常规

    则通行。

    下面的C++代码实现以上设计,请完善其中的空缺。

     

    #include 

    #include 

    using namespace std;

    class Vehicle {/*抽象基类,车辆*/

    public :

    virtual  void  run ()  =  0;

    };

    class Emergency(  /*抽象基类,可在红灯时通行的接口,函数均为纯虚函数*/

    public:

    (1)=0  //isEmergent()函数接口

    (2)=0  //runRedLight()函数接口

    };

    class Car: public Vehicle {

    public :

      -car(){  }

          void run () {   /*代码略*/ }

    };

    Ciass  Truck:public vehicie  {

     Public;

      -Truck(){  }

     Void  run() { /*代码略*/}

    };

    Class  policecar:  (3) {

    Private:

        bool isEmergency;

    public :

         PoliceCar ()   :  Car () ,  Emergency ()   {  this=>isEmergency = false;

    }

    PoliceCar (bool  b)   :  Car () ,  Emergency () {  this=>isEmergency = b; }

      ~PoliceCar ()   {      }

         bool  isEmergent ()  {  ret irn    (4)  ;   }

         void runRedLight ()  {  /*代码略*/ }

    };

    /*类Ambulance. FireEngine/*实现代码略*/

    class TraficControISystem {/*交通控制类*/

    private :

    Vehicle*v[24];    int numVeh: cles./*在构造函数中设置初始值为0*/

    public:

      void control(){  //控制在紧急情况下应急车辆红灯通行,其他情况按常规通行

    for (int i = 0; i<[numVehicles;++]  {

        Emergency*ev=dynamic_cast

    if (ev !=0(5)-: runRedLight ( ) 

    Else    (6)-:run()

    }

    }

    Void  add(vehicle){v[numvehicles++]=vehicle;}

                   /*添加车辆*/

    Void  shutdown(){for (int  i  =0;i

    }

    int main ()  {

        TraficControlSystem* tcs =new TraficControlSystem;

         tcs->add (new  Car ()  );,               t cs->add (new  PoliceCar ()) ;

      tcs->add (new Ambulance ()) ; tcs- >add (new Ambulance (true)) ;

    tcs->add (new  FireEngine (true)) ;  -.cs->add (new  FireEngine ()) ;

    tcs->add (new  Truck ()) ;

    tcs->control () ;                  tcs->shul Down ( ) ;

         delete tcs;

    }

  2.   阅读以下说明和Java代码,填充程序中的空缺,将解答填入答题纸的对应栏内。

    【说明】

        某应急交通控制系统(TraficControIS,stem)在红灯时控制各类车辆(Vehicle)的通

    行,其类图如图6-1所示,在紧急状态下应急车辆在红灯时可通行,其余车辆按正常规

    则通行。

     

        下面的Java代码实现以上设计,请完善其中的空缺。

    【Java代码】

    abstract class Vehicle

    public Vehicle ()  {   }

    abstract void run

    };

    interface Emergency {

             (1) ;

             (2) ;

    }

    class Car extends Vehicle {

          public Car ()  {   }

           void run () {   /*代码略*/  }

    };

    class Truck extends Vehicle  {

          public  Truck ()   {    }

           void run () {   /*代码略*/   }

    class PoliceCar   (3)

    boolean isEmergency = false;

    public  PoliceCar ()  {   }

    public PoliceCar(boolean b) {  this . isEmergency =b;   }

    public boolean  isEmergent ()  { return    (4);   }

    public void runRedLight () {   /*代码略*/    }

    }

    /*类Ambulance. FireEngine实现代码略*/

    public class TraficControISystem  {/。交通控制类。/

        private  Vehicle[ ]V=new  Vehiele [24];

        int numVehicles;

        public  void  control()  {

        for (int i=0;  i

        if  (v[i]   instanceof  Enu rgency&&  ((Emergency)V [i])

        isEmergent())  {

      ( 5 ) . runRedLigh': (  ) ;

      }else

    (6).run( )

    }

    }

    void add (Vehicle  vehicle)  {  v[numVehicles++]=vehicle;)/*添加车辆*/

    void shutDown()(/*代码略*/}

         public  static  void main (Stri.ng [ ]  args)   {

              TraficControlSystem tcs = new TraficControlSystem() ;

                  tcs . add (new  Car () ;

                  tcs .add (new  PoliceCar ()   ;

                  tcs .add (new  Ambulance ()   ;

                  tcs . add (new  Ambulance (true》 ;

                  tcs . add (new  FireEngine ( true》 ;

                  tcs . add (new  Truck () ;

                  tcs . add (new  FireEngine (   ) ;

                  tcs . control () ;

                  tcs . shutDown () ;

          }

    }

  3. 试题三(共15分)

        阅读以下说明和C代码,填充代码中的空缺,将解答填入答题纸的对应栏内。

    【说明1】

        下面的函数countChar(char *text)统计字符串text中不同的英文字母数和每个英文字

    母出现的次数(英文字母不区分大小写)。

    【C代码1】

    Int  countchar(char*text)

    {

    int i,sum=O;    /*sum保存不同的英文字母数*/

    char *ptr;

    int c[26]={0};    /*数组c保存每个英文字母出现的次数*/

    /*c[0]记录字母A或a的次数,c[1]记录字母B或b的次数,依此类推*/

      ptr=(1);    /* ptr初始时指向字符串的首字符*/

    while (*ptr)  {

        if  (isupper (*ptr)  )

        c[*ptr一’A’]++;

        else  '

        if  (islower (*ptr)  )

        c[*ptr一’a’]++;

    (2);    /*指向下一个与字符*/

    }

    for (  i=0.  i<26;  i++  )

     If(3)sum++;

    return sum;

    }

    【说明2]

        将下面C代码2中的空缺补全后运行,使其产生以下输出。

        f2: f2:f2:2

        f3: f3:1

    【C代码2]

    #include   

    int  fl (int  (*f) (int)) .

    int f2 (int) ;

    int f3 (int) ;

    int main ()

    {

    Printf(“%d\n”,f1(4))

    Printf(“%d\n”,f1(5))

    return 0;

    }

    int  fl(int  (*f) (int)  }

    {

        int n=O;

    /*通过函数指针实现函数调用,以返回值作为循环条件*/

    While(6) n++

    return n;

    }

    int f2 (int n)

    {

        printf ("f2:  ") ;

         return n*n-4;

    }

    int f3 (int n)

    {

    printf ("f3:  ") ;

    return  n-1

    }

  4.   阅读以下说明和C程序,填充程序中的空缺,将解答填入答题纸的对应栏内。

    【说明】

        正整数n若是其平方数的尾部,则称n为同构数。例如,6是其平方数36的尾部,

    76是其平方数5776的尾部,6与76都是同构数。下面的程序求解不超过10000的所有

    同构数。

        已知一位的同构数有三个:1,5,6,因此二位同构数的个位数字只可能是1,5,6

    这三个数字。依此类推,更高位数同构数的个位数字也只可能是1,5,6这三个数字。

        下面程序的处理思路是:对不超过100 00的每一个整数a,判断其个位数字,若为1、

    5或6,则将a转换为字符串as,然后对a进行平方运算,并截取其尾部与as长度相等

    的若干字符形成字符串后与as比较,根据它们相等与否来断定a是否为同构数。

    【C程序】

    #include

    #include

    #include

    int myitoa (int,  char*);    ,/*将整数转换为字符串*/

    /* right取得指定字符串尾部长度为ler gth的子串,返回所得子串的首字符指针*/

    char *right (char*,  int  length);

    int main ()

    {

        int  a, t;        int  len;

       char as [10],  rs[20];

    printf(”[1,10000]内的同构数:\r”);

    for (a=l.a<=10000; a++)    {

      t=  (1);    /*取整数a的个位数字*/

      if (t!=l&&t!=5&&t!=6)  :ontinue;

      len=myitoa (a, as)j    /*数a转换为字符串,存入as*/

      myitoa (a*a, rs);    /*数a的平方转换为字符串,存入rs*/

    /*比较字符串as与rs末尾长度为len的子争是否相等*/

        if(strcmp(as,__(2)  )**o)    /*若相同则是同构数并输出*/

        printf(“%s的平方为%s\n”,as,rs);

      }

      return O;

    }

    int  myitoa (int num,char*s)    /*将整数num转换为字符串存入s*/

    {

        int i,n=0;

        char ch;

    /*从个位数开始,取num的每一位数字转换为字符后放入s[]*/

        while (num)  {

        s[n++]  =(3)    +’o';

        num=num/10.

      }

      s[n]=’\0 ‘;

        for (i=0;  i

        (4)  ;  s[i]=  s [n-i-l];s[n-i-1]=ch;

    }

    return n;    /*返回输入参数num的位数*/

    }

    char *right (char*ms,  int  length)

    /*取字符串ms尾部长度为length的子串,返回所得子串的首字符指针*/

    {

    int i;

    For(;*ms;ms++)    /*使ms到达原字符串的尾部*/

    for( i=0;  i

    return ms;

    }

  5.   阅读以下说明和C函数,填充函数中的空缺,将解答填入答题纸的对应栏内。

    【说明】

        下面的函数sort(int n,int a[])对保存在数组a中的整数序列进行非递减排序。由于该

    序列中的元素在一定范围内重复取值,因此排序方法是先计算出每个元素出现的次数并

    记录在数组b中,再从小到大顺序地排列各元素即可得到一个非递减有序序列。例如,

    对于序列6,5,6,9,6,4,8,6,5,其元素在整数区间[4,9]内取值,因此使数组元素b[O]~b[5]的下标O~5分别对应数值4~9,顺序地扫描序列的每一个元素并累计其出现的次数,即将4的个数记入b[0],5的个数记入b[l],依此类推,9的个数记入b[5]。最后依

    次判断数组b的每个元素值,并将相应个数的数值顺序地写入结果序列即可。

    对于上例,所得数组b的各个元素值如下:

        那么在输出序列中写入1个4、2个5、4个6、1个8、1个9,即得4,5,5,6,6,6,6,8,9,

    从而完成排序处理。

    【C函数】

    void sort(int n,int a[])

    (   int *b;

        int i,  k,  number;

    int minimum=a[0], maximum=a 0];

    /.minimum和maximum分别表示数组a的最小、最大元素值*/

    For(i=1;i

        if ( _(1)  ) minimum = a[j];

       else

           if ( _ (2)  ) maximum = a[i];

    }

       number = maximum - minimum + 1;

        if (number<=l) return;

    b  =   (int  *) calloc (number,   sizeod (int) ;

        if  ( !b)   return;

        for(f=0;i

        k= a[i] - minimum;    ++b[k];

    }

    /*按次序在数组a中写入排好的序列*/

        l=    (3)  ;

        for(  k=0;  k

        for(;    (4)  ;一一b[k]  )

        a[i++】=minimum+    (5)’  ;

    }

  6. 试题一(共15分)

        阅读以下说明和流程图,填补流程图中的空缺(1)~(5),将解答填入答题纸的

    对应栏内。

    【说明】

        两个包含有限个元素的非空集合A、B的相似度定义为IAUBI/IA U Bl,即它们的交

    集大小(元素个数)与并集大小之比。

        以下的流程图计算两个非空整数集合(以数组表示)的交集和并集,并计算其相似

    度。己知整数组A[1:m】和B【1:n】分别存储了集合A和B的元素(每个集合中包含的元素

    各不相同),其交集存放于数组C[1:s】,并集存放于数组D【1:t】,集合A和B的相似度存

    放于SIM。

        例如,假设A={1,2,3,4},B={1,4,5,6},则C={1,4},D={1,2,3,4,5,

    6},A与B的相似度SIM=1/3。