Skip to content

Latest commit

 

History

History
603 lines (493 loc) · 14.1 KB

[题解]十一、向前冲-期末测试.md

File metadata and controls

603 lines (493 loc) · 14.1 KB

十一、向前冲-期末测试

编程题

求1-1/4+1/7-1/10+1/13-1/16+…的前n 项之和

【问题描述】 输入一个正整数n,计算1-1/4+1/7-1/10+1/13-1/16+...的前n 项之和,输出时保留3位小数。 【输入形式】 从键盘输入一个正整数n。 [输入输出样例1] (下划线部分表示输入) Enter n:

3
sum=0.893

[输入输出样例2] (下划线部分表示输入) Enter n:

10
sum=0.819

【样例说明】 输入提示符后要加一个空格。其中":"后要加一个且只能一个空格。 输出语句的"="两边无空格。 英文字母区分大小写。必须严格按样例输入输出。

#include<stdio.h>
int main()
{
    int n=0,flag=1,d=1;
    printf("Enter n: ");
        scanf("%d",&n);
    double sum=0.0,temp=0.0;
    
    for (int i = 1; i <=n; i++)
    {
        temp=1.0*flag/d;
        d+=3;
        sum+=temp;
        flag=-flag;
    }
    
    printf("sum=%.3lf",sum);
    
}

小数形式与科学计数法转换

【问题描述】 编写一个程序,将用小数或整数形式输入的数据,转换成科学计数法的形式输出。输入的数据没有符号。输入数据全为有效数据,即若输入的数据为小数形式,则末尾不含数字0;并且若输入的数据大于1,则最高位数字不为0。 提示:以字符串形式保存相关数据。 【输入形式】 控制台输入一小数或整数,最后会有回车换行符,所有输入的字符数不会超过100。 【输出形式】 以科学计数法形式输出数据。输出的数据由以下几部分构成: 1.底数部分是一个小数或整数,若为小数,则小数点前后必有数字,而且都为有效数字。即:小数点前只有一位大于0的数字,小数点后的末尾数字不能为0。若为整数,则只有一位数字,不带小数点。 2.必有小写字母“e”。 3.指数部分是一个整数。若大于等于0,则不带符号;若小于0,则需要带负号“-”。且整数的最高位数字不为0。 【输入样例1】

0.000000000000002

【输出样例1】

2e-15

【输入样例2】

898456.23489651700659

【输出样例2】

8.9845623489651700659e5

【输入样例3】

367298599999090000000000000000000000000000

【输出样例3】

3.6729859999909e41

【样例说明】 以小数或整数形式输入数据,然后转换成相应的科学计数法形式输出。 【评分标准】 该题要求以科学计数法形式输出数据,提交程序文件名为notation.c。

#include<stdio.h>
#include<string.h>
void delDot(char number[]);
void delZero(char number[]);
void Print(char number[],int flag,int k);
int main()
{
    char number[101];
    scanf("%s",number);
    char *num=number;
    if (number[0]=='0'&&number[1]=='.')
    {
        int i=2,k=0,flag=0;
        while (number[i]!='\0')
        {
            if (number[i]!='0')
            {
                flag=i;
                if (number[i+1]!='\0')
                {
                    Print(number,flag,k);
                    return 0;
                }
            }
            k++;            //统计指数
            i++;
        }
        printf("%se-%d",(num+flag),k);
    }
    else if (number[1]=='.')
    {
        printf("%se0",number);
    }
    else
    {
        int i=1,k=0;
        while (number[i]!='\0')
        {
            if (number[i]=='.')
            {
                delDot(number);
                break;
            }
            k++;
            i++;
        }
        if (number[i-1]=='0')
        {
            delZero(number);
        }
        printf("%c.%se%d",number[0],(num+1),k);
    }
}
void delDot(char number[])
{
    int n=0;
    int m=strlen(number);
    for (int i = 0; number[i]!='\0'; i++)
    {
        if (number[i]=='.')
        {
            for (int j = i; j < m; j++)
            {
                number[j]=number[j+1];
            }
        n++;i--;
        }
    }
    number[m-n]='\0';
}
void delZero(char number[])
{
    int i=strlen(number);
    while(i>0)
    {
        if (number[i-1]=='0')
        {
            number[i-1]='\0';
        }
        else
        {
            return;
        }
        
    i--;
    }
}
void Print(char number[],int flag,int k)
{
    printf("%c.%se-%d",number[k+2],(number+flag+1),k+1);
}

超长正整数的减法

【问题描述】编写程序实现两个超长正整数(每个最长80位数字)的减法运算。 【输入形式】 从键盘读入两个整数,要考虑输入高位可能为0的情况(如00083)。

  1. 第一行是超长正整数A;

  2. 第二行是超长正整数B;

【输出形式】 输出只有一行,是长整数A减去长整数B的运算结果,从高到低依次输出各位数字。要求: 1、若结果大于0,则只输出结果数字,不输出正号;若结果为负,则输出负号;若结果为0,则只输出一个0。 2、除非结果为0,否则输出的结果的最高位不能为0,并且各位数字紧密输出。 【输入样例】

234098
134098703578230056

【输出样例】

134098703577995958

【样例说明】 进行两个正整数减法运算, 234098 - 134098703578230056 = -134098703577995958。 【评分标准】 该题要求输出超长整数减法结果,提交程序文件名为subtract.c或subtract.cpp。

国王的麦粒

【问题描述】 相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜欢象棋,决定让宰相自己选择何种赏赐。 这位聪明的宰相指着8×8共64格的象棋盘说:陛下,请您赏给我一些麦子吧,就在棋盘的第一个格子中放1粒,第2格中放2粒,第3格放4粒,以后每一格都比前一格增加一倍,依此放完棋盘上的64个格子,我就感恩不尽了。舍罕王让人扛来一袋麦子,他要兑现他的许诺。 国王能兑现他的许诺吗?试编程计算舍罕王共要多少麦子赏赐他的宰相,这些麦子合多少立方米(volume)? (已知1立方米麦子约1.42e8粒) 总粒数为:

sum=1+2+22+23+…+263  

函数pow(a,b)表示求a^b

double pow(double base, double exponent);

需要math.h头文件 【输入形式】 【输出形式】

volume: 1.299066e+011
#include<stdio.h>
#include<math.h>
int main()
{
    double sum=1,k=0;
    for (int i = 1; i <= 64; i++)
    {
        sum=sum+pow(2,k++);
    }
    double volume=sum/1.42e8;
    int j = 0;
    for (j = 0; volume>10 ; j++)
    {
        volume/=10;
    }
    
    printf("volume: %lfe+%d",volume,j);
}

求一个整数中2的个数

【问题描述】 读入一个整数,统计并输出该数中2的个数。要求定义并调用函数countdigit(number,digit),它的功能是统计整数number 中数字digit 的个数。例如,countdigit(10090,0) 的返回值是3。 【输入形式】 输入一个整数 [输入输出样例1] (下划线部分表示输入) Enter an integer:

21252
Number of digit 2: 3

【样例说明】 输入提示符后要加一个空格。例如Enter an integer: ,其中:后要加一个且只能一个空格。 输出语句的:后要加一个且只能一个空格。 英文字母区分大小写。必须严格按样例输入输出。

#include<stdio.h>
int countdigit(int number,int digit);
int main()
{
    int number=0,digit=2,num=0;
    scanf("%d",&number);
    printf("Enter an integer: ");
    num=countdigit(number,digit);
    printf("Number of digit 2: %d",num);
}
int countdigit(int number,int digit)
{
    int i=0;
    int count=0;
    while (number>0)
    {
        i=number%10;
        if (i==2)
        {
            count++;
        }
        number/=10;
    }
    return count;
}

交换最大、最小值

【问题描述】 输入一个正整数n(1 <n≤10),再输入n 个整数,将最小值与第一个数交换,最大值与最后一个数交换,然后输出交换后的n 个数。 【输入形式】 从键盘输入一个正整数n和n个整数。 [输入输出样例1] (下划线部分表示输入) Input n:

5

Input 5 integers:

 8 2 5 1 4
After swapped: 1 2 5 4 8  

​ (每个输出数据间有一个空格) 【样例说明】 输入提示符后要加一个空格。例如Input n: ,其中:后要加一个且只能一个空格。 英文字母区分大小写。必须严格按样例输入输出。

#include<stdio.h>
void getArray(int a[],int n);
void doSwap(int a[],int n);
int main()
{
    int n=0;
    printf("Input n: ");
    scanf("%d",&n);
    int a[n];
    getArray(a,n);
    printf("After swapped: ");
    doSwap(a,n);
}
void getArray(int a[],int n)
{
	printf("Input %d integers: ",n);
	for(int i=0;i<n;i++) {
		scanf("%d",&a[i]);
	}
}
void doSwap(int a[],int n)
{
    int min=100,max=-100;
    int min_flag=0,max_flag=0;
    for (int i = 0; i < n; i++)
    {
        if (max<=a[i])
        {
            max=a[i];
            max_flag=i;
        }
    }
    int t=0;
        t=a[n-1];a[n-1]=a[max_flag];a[max_flag]=t;
    for (int i = 0; i < n; i++)
    {
        if (min>=a[i])
        {
            min=a[i];
            min_flag=i;
        }
    }
    t=0;
        t=a[0];a[0]=a[min_flag];a[min_flag]=t;
    for (int i = 0; i < n; i++)
    {
        printf("%d ",a[i]);
    }
    
}

将一笔钱换算成1分、2分和5分的硬币组合

【问题描述】 将一笔钱(大于8分,小于1元,精确到分)换算成1分、2分和5分的硬币组合。输入金额,问有几种换算方法?要求每种硬币至少有一枚。 【输入形式】 从键盘输入一个正整数n。 [输入输出样例1] (下划线部分表示输入)

Input money: 10
count=2

【样例说明】 输入提示符后要加一个空格。其中:后要加一个且只能一个空格。 英文字母区分大小写。必须严格按样例输入输出。

#include <stdio.h>
int main()
{
    int a,b,c;
	int money,i;
    printf("Input money:");
    scanf("%d",&money);
    i=0;
    for (a=money/5;a>0;a--) 
	{
		for (b=money/2; b>0; b--) 
		{
            for (c=money; c>0; c--) 
			{
                if (a*5+b*2+c==money) 
					i++;
            }
        }
    }
    printf(" count=%d\n",i);
}

多项式加法

【问题描述】编写一个程序实现两个一元多项式相加的运算。 【输入形式】从当前目录下的poly.in文件读入两行以空格分隔的整数,每一行代表一个多项式,且该多项式中各项的系数均为0或正整数,最高幂次不超过50。对于多项式(n<50)的表示方法如下: an n an-1 n-1 …… a1 1 a0 0 即相邻两个整数分别表示表达式中一项的系数和指数。在输入文件中只出现系数不为0的项。 【输出形式】将运算结果输出到当前目录下的poly.out文件中。将系数不为0的项按指数从高到低的顺序输出,每次输出其系数和指数,均以空格分隔。在行的末尾输出一个回车符。 【输入文件】

54 8 2 6 7 3 25 1 78 0
43 7 4 2 8 1

【输出文件】

54 8 43 7  2 6  7 3  4 2  33 1  78 0

【样例说明】输入文件的两行分别代表了表达式$54x^8 +2x^6 +7x^3 +25x+78+43x^7 +4x^2 +8x$其和为$54x^8 +43x^7 +2x^6 +7x^3 +4x^2 +33x+78$ 【评分标准】结果正确则该测试点得满分,否则该测试点得0分。上传C语言文件名为 poly.c

求m到n之间所有数字的和

【问题描述】输入一个正整数m和n,输出从m开始到n结束(包含m和n)的所有整数数字的和。 【输入形式】两个正整数,用空格分隔 【输出形式】两个正整数之间的整数数字的和,以“sum=?”的形式输出。 【样例输入】

1 100 

【样例输出】

sum=5050
#include<stdio.h>
int main()
{
    int m=0,n=0,sum=0;
    scanf("%d",&m);
    scanf("%d",&n);
    for (; m <= n; m++)
    {
        sum+=m;
    }
    printf("sum=%d",sum);
}

学生成绩排序

【问题描述】 对某班学生成绩排序。从键盘依次输入某班学生的姓名和成绩(一个班级人数最多不超过50人)并保存,然后分别按学生成绩由高到低顺序输出学生姓名和成绩,成绩相同时,则按输入次序排序。 【输入形式】 从键盘依次输入最多不超过50个学生的学生姓名和成绩: 第一行输入班级学生人数; 在单独行上输入空格隔开的学生姓名和成绩,其中学生成绩是整数。 【输出形式】 按学生成绩由高到低顺序输出学生姓名和成绩,每行输出一位学生的姓名和成绩,其中姓名(英文)占15位,成绩占5位,均按缺省方式对齐。成绩相同时按输入次序排序。 【输入样例】

4
aaa 50
bbb 70
ccc 65
ddd 90

【输出样例】

############ddd###90
############bbb###70
############ccc###65
############aaa###50

(注意:其中#号代表空格) 【样例说明】 输入了四个学生姓名和成绩,按成绩排序输出。 【评分标准】 按成绩顺序输出学生姓名和成绩,完全正确得50分,共五个测试点,每个测试点10分,提交程序名为c02.c。

#include<stdio.h>
struct Student
{
    char name[20];
    int score;
};
int main()
{
    struct Student Excel[50];
    int n=0;
    scanf("%d",&n);
    for (int i = 0; i < n; i++)
    {
        scanf("%s %d",Excel[i].name,&Excel[i].score);
    }
	struct Student t;
	for(int i=0;i<n-1;i++)
		for(int j=0;j<n-i-1;j++)
			if(Excel[j].score<Excel[j+1].score){
				t=Excel[j];
				Excel[j]=Excel[j+1];
				Excel[j+1]=t;
			}    
    for (int i = 0; i < n; i++)
    {
        printf("%15s%5d\n",Excel[i].name,Excel[i].score);
    }
}