ITAT复赛答案集锦(1)

第一届

1.       输入一个五位整数,将它反向输出。例如输入12345,输出应为54321。(15分)

Strrev();

2.      用两种循环结构分别编程计算1+2+3…+100的值。
运行结果为“1+2+…+100=5050”(15分)

3.       从终端读入20个数据到数组中,统计其中正数的个数,并计算它们之和。(15分)

4.       利用指针实现将5个整数输入到数组a中,然后将a逆序复制到数组b中,并输出b中各单元的值。(20分)

5.       要将五张100元的大钞票,换成等值的50元,20元,10元,5元一张的小钞票,要求换成30张小钞票,每种面值的至少一张,编程输出所有可能的换法,程序应适当考虑减少重复次数。(25分)

6.       求n以内(不包括n)同时能被3和7整除的所有自然数之和的平方根s,并作为函数值返回,最后结果s输出到文件out.dat中。例如若n为1000时,函数值应为:s=153.909064。(30分)

第四届(A)

1、编写一个程序,让它有以下功能:从键盘上输入一个五位数,对此整数中的五个数值进行从大到小排序,形成一个新的五位数,输出这个整数。(15分)

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

int cmp(const void* a,const void* b)

{

    return *(char*)b - *(char*)a;

}

int main()

{

    char s[6];

    scanf("%s",s);

    qsort(s,5,sizeof(s[0]),cmp);

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

}

2、输入年、月、日,输出该日期是该年的第几天。(25分)

3、利用数组实现数据的存储。将学生的学号和成绩存储在数组中,利用循环计算出数组中存储学生的平均成绩,找出高于平均分的学生信息并输出。(20分)

4、输入五个国家的名字,按字母顺序(即按ASCII码从小到大的顺序)排列输出。(20分)

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

 

int cmp(constvoid* a,const void* b)

{

    return strcmp((char*)a,(char*)b);

}

int main()

{

    int i;

    char s[5][10];

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

        scanf("%s",s[i]);

    qsort(s,5,sizeof(s[0]),cmp);

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

        printf("%s\n",s[i]);

}

5、用指针实现:任意输入20个数,将它们按照从大到小的顺序输出。(20分)

附加题

6、编写一个简单的通讯录管理系统。通讯录包括:姓名、通讯地址、邮编、联系电话,现编写一个通讯录管理系统,可以对通讯录进行输入、显示、查找,通讯录保存到一个文件中。(50分)

(提示:可能用到以下库函数:

malloc(),功能:分配size字节的存储区,

用法:(类型 *)malloc(size *sizeof(你要定义的类型));包含于<stdlib.h>库中

feof(),功能:检测文件是否结束

用法: int feof(fp)

FILE *fp;包含于<stdio.h>库中。)

(B)

1、编程完成数据加密。数据是五位的整数,加密规则为:每位数字都加上6,然后用和除以8的余数代替该数字,再将第一位和第五位交换,第二位和第四位交换。(15分)

2、请猜数字,该数字由系统随即产生。要求:用户最多有10次猜测的机会,如果在10次内猜对数字,则程序显示祝贺信息,如果连续10次都没有猜中数字,则游戏自动退出。(25分)

(提示:可能用到以下库函数:

randomize();用系统的时间作为随机种子;包含于stdlib.h库中

random(100):随机产生0-99之间的一个随机数;包含于stdlib.h库中

toupper():将字符c转换为大写英文字母,包含于ctype.h库中)

3、有一个3×4的矩阵,要求编写程序找出每一行中最大值并与第一列交换。(20分)

4、输入五个字符串,要求按照字母顺序(即按ASCII码从小到大的顺序)输出这五个字符串。(20分)

5、用指针实现:把一个整数插入到由小到大排列的数列中,插入后仍然保持由小到大的顺序。(20分)

附加题

6、编写一个简单的通讯录管理系统。通讯录包括:姓名、通讯地址、邮编、联系电话,现编写一个通讯录管理系统,可以对通讯录进行输入、显示、查找等,通讯录保存到一个文件中。(50分)

(提示:可能用到以下库函数:

malloc(),功能:分配size字节的存储区,

用法:(类型 *)malloc(size *sizeof(你要定义的类型));包含于<stdlib.h>库中

feof(),功能:检测文件是否结束

用法: int feof(fp)

FILE *fp;包含于<stdio.h>库中。)

第五届(A)

1、 编程解决如下数学问题:有12升水,怎样利用一个8升和一个5升的容器将水分为两个6升?要求以如下格式打印出分水步骤。(20分)

   a12 b8  c5

   12  0   0

   *   *   * ( “*”表示当前状态下每个容器的盛水量)

   ......

   0   6   6

2、 编程实现:有二维数组a[3][3]={{5.4,3.2,8},{6,4,3.3},{7,3,1.3}},将数组a的每一行元素均除以该行上的主对角元素(第1行同除以a[0][0],第2行同除以a[1][1],...),按行输出新数组。(20分)

3、 编程:设x取值为区间[1,20]的整数,求函数f(x)=x-sin(x)- cos(x)的最大值,要求使用自定义函数实现f(x)功能。(20分)

4、 编写函数fun,通过指针实现将一个字符串反向。要求主函数输入字符串,通过调用函数fun实现输入字符串反向。(20分)

5、 已知学生三门课程基本信息如下。请使用结构体编程,计算学生三门课程平均成绩后,列表输出学生的姓名、数学、英语、计算机、平均分信息,并按平均分排序。(20分)

   姓名  数学 英语 计算机

   Mary 93    100   88

   Jone  82    90   90

   Peter  91    76   71

   Rose  100   80   92

6、 附加题:编程实现输入一串英文,统计其中各单词出现的个数(不区分大小写字母),以“000”作为字符串输入结束标志,例如:

   Twinkle twinkle little star 000(回车)

   twinkle little  star

     2     1     1   (50分)        

(B)

1、 编程解决如下问题:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,       问鸡翁,鸡母,鸡雏各几何?(20分)

2、 编程实现:有二维数组a[3][3]={{1.3,2.7,3.6},{2,3,4.7},{3,4,1.27}},将数组a的每一行元素均除以该行上绝对值最大的元素,按行输出新数组。(20分)

3、 编程:设x、y取值为区间[1,10]的整数,f(x,y)=(3x-2y)/(x+y),求使f(x,y)取最小值的x1、y1,要求使用自定义函数实现f(x,y)功能。(20分)

4、 编写函数fun,其功能是:在字符串中所有数字字符前加一个“*”字符,要求通过指针实现。(20分)

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <math.h>

 

void fun(char *str)

{

    char*s_p,*s_new;

    s_p = str;

    while(*s_p!='\0')

    {

        if(*s_p>='0'&&*s_p<='9')

        {

            s_new = (char*)malloc(strlen(str)+1);

            strcpy(s_new,s_p);

            *s_p = '\0';

            strcat(str,"*");

            s_p++;

            strcat(str,s_new);

            free(s_new);

            s_new = NULL;

        }

        s_p++;

    }

    puts(str);

}

 

int main()

{

    charstr[100];

    gets(str);

    fun(str);

    return 0;

}

 

5、 编程:已知学生记录由学号和学习成绩构成,N名学生的记录已存入结构体数组中,找出成绩最低的学生,并输出这个学生的信息,已知学生信息如下。(20分)

A01,81;A02,89;A03,66;A04,87;A05,77

A06,90;A07,79;A08,61;A09,80;A10,71

6、 附加题:编写一个函数InverseByWord(char*sentence),实现一个英文句子按单词逆序存放的功能,并给出测试程序。(50分)

如:This is an interestingprogramme.

逆序后变为:.programmeinteresting an is This

第六届(A)

编程解决如下问题(50分)。

有一个数学等式:AB*CD=BA*DC,式中的一个字母代表一位数字,试找出所有符合上述要求的乘积式并打印输出。

2. 编程解决如下问题(50分)。

请在整数n=742683613984中删除8个数字,使得余下的数字按原次序组成的新数最小。要求如下:

(1)整数n和删除数字的个数“8”在源程序中完成赋值,程序直接输出运行结果;

(2)程序结果输出先后被删除的数字(之间以逗号分隔)和删除后所得的最小数。

(提示:整数n可以以字符数组的方式定义、赋值和处理)

3. 附加题:编程解决如下问题(50分)。

    (1)已知平面上三个点:(7,1)、(4,6)、(5,8),判断这三点组成的三角形是何种三角形(锐角,直角,钝角)(10分);

(2)对(1)问中的三角形,给出它的外接圆半径(20分);

(3)已知平面上6个点的坐标为:(7,1)、(4,6)、(5,8)、(6,2)、(3,9)、(2,7),试求覆盖这6个点的覆盖圆最小半径(20分)。

(要求:点坐标数据在程序初始化中赋值完成,程序运行后直接输出结果,不进行数据输入;点坐标数据和题目要求完全一致,否则导致的结果不正确视为程序编写错误。)

(B)

编程解决如下问题(50分)。

有一个数学等式:ABCD*E= DCBA,式中的一个字母代表一位数字,试找出所有符合上述要求的乘积式并打印输出。

#include <stdio.h>

#include <stdlib.h>

int main()

{

    intnum,i,j,s;

    int div[4] ={0};

    for(j=1000;j<=9999;j++)

    {

        num = j;

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

        {

            div[i] = num % 10;

            num = num / 10;

        }

        s = div[0] * 1000 + div[1] * 100 +div[2] * 10 + div[3];

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

        {

            if(j* i == s)

            {

                printf("%d* %d = %d\t",j,i,s);

            }

        }

    }

    return 0;

}

 

2. 编程解决如下问题(50分)。

请在整数n=92081346718538中删除10个数字,使得余下的数字按原次序组成的新数最大。要求如下:

(1)   整数n和删除数字的个数“10”在源程序中完成赋值,程序直接输出运行结果;

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int cmp(const void *a,const void *b)

{

    return *(char*)b - *(char*)a;

}

 

int main()

{

    char n[] = "92081346718538";

    int m = 10;

    int i;

    int len =strlen(n) - m;

    qsort(n,sizeof(n),sizeof(n[0]),cmp);

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

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

    printf("\n");

    return 0;

}

 

修改版:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

int main()

{

    char n[] = "72081346718538";

    int len =strlen(n);

    int m = 10;

    int length =len - m;

    int i,j,pos;

    int num;

    pos = 0;

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

    {

        num = -1;

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

        {

            if(n[j]-'0'>num)

            {

                num = n[j]-'0';

                pos = j;

            }

 

 

        }

        printf("%d",num);

        m++;

        pos++;

    }

    return 0;

}

 

(2)程序结果输出先后被删除的数字(之间以逗号分隔)和删除后所得的最大数。

(提示:整数n可以以字符数组的方式定义、赋值和处理)

       #include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

int cmp(const void *a,const void *b)

{

    return *(char*)a - *(char*)b;

}

 

int main()

{

    char n[] = "92081346718538";

    int len =strlen(n);

    char m[100]= {0};

    strcpy(m,n);

    int i,j;

    qsort(m,len,sizeof(m[0]),cmp);

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

    {

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

        {

            if(n[i]==m[j])

            {

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

                break;

            }

        }

    }

    for(i=len-1;i>=10;i--)

        printf("%c",m[i]);

    printf("\n");

 

    return 0;

}

 

3. 附加题:编程解决如下问题(50分)。

在小于10的素数中有3、5、7组成的等差数列,在小于30的素数中有11、17、23、29组成的等差数列。试找出区间[100,1000]内的素数构成的最大等差数列(即等差数列包含的素数个数最多)并打印输出。

 

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <math.h>

 

int main()

{

    intprime[1000]={0};

    inti,j,k,sub,*max,*max_temp,count_temp=0,l=0,count=0;

    for(i=101;i<=1000;i+=2)

    {

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

        {

            if(i%j==0)break;

        }

        if(j>sqrt(double(i))) prime[l++] = i;//k??ºy

    }

 

 

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

        printf("%d\t",prime[i]);

    printf("\n===========================================\n");

    max = (int*)malloc(l*sizeof(int));

    max_temp = (int*)malloc(l*sizeof(int));

    memset(max,0,sizeof(max));

    memset(max_temp,0,sizeof(max_temp));

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

    {

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

        {

            count_temp = 0;

            max_temp[count_temp++] = prime[i];

            max_temp[count_temp++] = prime[j];

            sub = prime[j] - prime[i];

            for(k=j+1;k<l;k++)

            {

                if(prime[k]-max_temp[count_temp-1]==sub)

                {

                    max_temp[count_temp++] =prime[k];

                }

            }

            if(count<= count_temp)

            {

                count = count_temp;

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

                {

                    max[k] = max_temp[k];

                }

            }

        }

    }

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

        printf("%d\t",max[i]);

 

    printf("\n===========================================\n");

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

    {

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

        {

            count_temp = 0;

            max_temp[count_temp++] = prime[i];

            max_temp[count_temp++] = prime[j];

            sub = prime[j] - prime[i];

            for(k=j+1;k<l;k++)

            {

                if(prime[k]-max_temp[count_temp-1]==sub)

                {

                    max_temp[count_temp++] =prime[k];

                }

            }

            if(count== count_temp)

            {

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

                {

                    printf("%d\t",max_temp[k]);

                }

                printf("\n");

            }

        }

    }

    return 0;

}

 

 

原文地址:https://www.cnblogs.com/lgh1992314/p/5835381.html