程序设计实训总结

文章介绍了在线自动判题系统用于编程练习的多个题目,包括计算整数和、阶乘尾部0的个数、判断算式正确性、求最大值、计算整数和、字符串数字之和、角度计算、算术与几何平均数、和式计算以及同构数判断。每个题目都提供了输入输出示例及相应的C/C++代码实现。
摘要由CSDN通过智能技术生成

在线自动判题系统练习题集

在线自动判题系统网址http://acmoj.shu.edu.cn。用学号登录(初始密码同学号),进入“比赛”,第254号比赛。其中第01-05题为例题,第06-10题为练习题。所有10道题目都必须提交,其提交情况也作为本练习排名的依据,亦即作为本课程成绩的依据之一。

00 计算两个整数的和

问题描述       给定两个整数,计算它们的和。

输入        输入数据有若干行。每行上有两个整数,对应一种情形。

输出        对于每一种情形,先输出“Case #: #为序号,从1起),然后输出算式和结果。

输入样例

98 72

-40 88

-62 -95

输出样例

Case 1: 98 + 72 = 170

Case 2: -40 + 88 = 48

Case 3: -62 - 95 = -157

01 阶乘尾部0的个数

问题描述   给定非负整数n,计算n的阶乘尾部0的个数。

输入   输入数据有若干行。每行上有一个正整数n,对应一种情形。

输出   对于每一种情形,先输出“Case #: ”(#为序号,从1起),然后输出n的值,逗号,结果,换行。

输入样例

8

16

30

输出样例

Case 1: 8, 1

Case 2: 16, 3

Case 3: 30, 7

#include <stdio.h>

int main()
{
    long long int n;
    long long int i = 0;

    while (scanf("%d",&n) == 1 )
    {
        long long int count = 0;
        long long int num = n;
        
        while(n>=5)
        {
            count += n/5;
            n /= 5;
        }
        
        printf("Case %d: %d, %d\n",++i,num,count);
    }
    
    return 0;
}

02 判断算式的正确性

问题描述   给定一个算式,该算式中只含一个四则运算符号,操作数及结果均为整数。要求判断该算式的正确性(规定:除法必须除尽才算正确)。

输入   输入数据有若干行。每行上有一个算式,对应一种情形。

输出   对于每一种情形,先输出“Case #: ”(#为序号,从1起),然后输出结果(Yes或No),换行。

输入样例

1 + 2 = -3

5 / 2 = 2

4 / 2 = 2

输出样例

Case 1: No

Case 2: No

Case 3: Yes

#include <stdio.h>
#include <time.h>

int main()
{
    int a[3];
    char c[2];
    int i = 0;
    char m;

    while (scanf("%d %c %d %c %d", &a[0], &c[0], &a[1], &c[1], &a[2]) == 5)
    {
        if (c[0] == '+')
        {
            if (a[0] + a[1] == a[2])
                printf("Case %d: Yes\n", ++i);
            else
                printf("Case %d: No\n", ++i);
        }
        else if (c[0] == '*')
        {
            if (a[0] * a[1] == a[2])
                printf("Case %d: Yes\n", ++i);
            else
                printf("Case %d: No\n", ++i);
        }
        else if (c[0] == '/')
        {
            if (a[1] != 0)
            {
                if ((float)a[0] / (float)a[1] == (float)a[2])
                    printf("Case %d: Yes\n", ++i);
                else
                    printf("Case %d: No\n", ++i);
            }
            else
                printf("Case %d: No\n", ++i);
        }
        else if (c[0] == '-')
        {
            if (a[0] - a[1] == a[2])
                printf("Case %d: Yes\n", ++i);
            else
                printf("Case %d: No\n", ++i);
        }
    }

    return 0;
}

03 求给定的n个实数中的最大值

问题描述   给定正整数n及n个实数,找出其中的最大值。

输入   输入数据有若干行。每行上第一个数为正整数n,紧接其后有n个实数,对应一种情形,数据之间用空格分隔。

输出   对于每一种情形,先输出“Case #: ”(#为序号,从1起,冒号后输出一个空格),然后输出计算结果(保留1位小数),最后换行。

输入样例

3

1.0 3.0 2.0

5

10.0 8.5 15.3 7.8 5.8

1

3.3

输出样例

Case 1: 3.0

Case 2: 15.3

Case 3: 3.3

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{   
    int n;
    float a[1000];

    for(int num = 1;n != '\n';num++)
    {
        cin >> n;
        for (int i = 0; i < n; i++)
            cin >> a[i];

        float maximum = a[0];
        for (int j = 0; j < n; j++)
        {
            if (a[j] > maximum)
                maximum = a[j];
        }

        cout << "Case " << num << ": ";
        cout << fixed << setprecision(1) << maximum << "\n";
    }
        
    cout<<endl;
}
#include <stdio.h>

int main()
{
    int n;
    float a[1000];

    int num = 1;
    while (scanf("%d", &n) == 1)
    {
        for (int i = 0; i < n; i++)
            scanf("%f", &a[i]);

        float maximum = a[0];
        for (int j = 0; j < n; j++)
        {
            if (a[j] > maximum)
                maximum = a[j];
        }

        printf("Case %d: %.1f\n", num, maximum);
        num++;
    }

    return 0;
}

04 计算若干个整数的和

问题描述   对于给定的若干个整数,要求计算它们的项数及和。

输入   输入数据有多行。每一行有若干个整数(个数不超过1024. C++程序不受此限制),希望计算它们的项数及总和。

输出   对于每一行中的数据,要求先输出“Case #: ”(#为序号从1起,冒号后输出一个空格),然后输出该行上数据的个数、逗号、空格、总和、换行。

输入样例

15 3 42 89

51 201 303 9 755 800

输出样例

Case 1: 4, 149

Case 2: 6, 2119

#include<stdio.h>

int main()
{
    int a[100];
    int j = 0;

    while(scanf("%d",&a[0]) == 1)
    {
        int sum = a[0];
        int i = 1;
        while(getchar() != '\n')
        {
            scanf("%d",&a[i]);
            sum+=a[i];
            i++;
        }
        printf("Case %d: %d, %d\n",++j,i,sum);
    }

    return 0;
}

05 态度决定一切

问题描述   将英文26个字母A~Z,或a~z对应到整数1~26,则态度 Attitude 对应的数字之和为100。编程计算给定的字符串对应的数字之和(规定非英文字母的字符均对应0)。

输入   输入数据的第一行为一个整数n,其后共有n行字符串(字符串的长度不超过1000)分别表示n种情形。

输出   对于每一种情况,要求先输出“Case #: ”(#为序号,从1起,冒号后输出一个空格),然后输出原字符串、空格、等号、空格、结果、换行。

输入样例

3

attitude

Hard Work

knowledge

输出样例

Case 1: attitude = 100

Case 2: Hard Work = 98

Case 3: knowledge = 96

#include <stdio.h>
#include <string.h>

int main()
{
    int n;
    char str[100];
    int sum,counts =0;

    scanf("%d",&n);
    gets(str);
    for (int i = 0;i < n;i++)
    {
        sum = 0;
        gets(str);
        for (int j = 0;str[j] != '\0';j++)
        {
            if(str[j] >='a' && str[j] <= 'z')
                sum += str[j] - 'a' + 1;
            else if(str[j] >= 'A' && str[j] <= 'Z')
                sum += str[j] - 'A' + 1;
        }
        printf("Case %d: %s = %d\n",++counts,str,sum);
    }

    return 0;
}

06 二维平面上过圆点直线与x轴的夹角

问题描述  给定平面坐标系XOY上的一个点P(x, y),计算从x轴正向与OP之间的夹角。

输入   输入数据有若干行。每行上有两个浮点型数据,对应一种情形。

输出   对于每一种情形,先输出"Case #: "(#为序号,从1起),然后输出结果。注意结果应该在区间[-180°, 180°]中(保留2位小数)。

输入样例

1 0

-1 1

-1 -1

0 -1

输出样例

Case 1: 0.00

Case 2: 135.00

Case 3: -135.00

Case 4: -90.00

#include<stdio.h>
#include<math.h>

int main(){
    float x,y;
    int n,t;
    n=1;
    while(scanf("%f %f",&x,&y)==2){
        printf("Case %d: %.2f\n",n,atan2(y,x)*180.0/3.1415926);
        n++;
    }
    return 0;
}


07 算术平均数及几何平均数

问题描述   给定一系列双精度浮点型数据,计算其项数、算术平均数和几何平均数。

输入   输入数据有若干行。每行上有若干个(不超过20个)双精度浮点型数据,对应一种情形。

输出   对于每一种情形,先输出"Case #: "(#为序号,从1起),然后参照输出样例输出数据的项数、算术平均数、几何平均数(保留2位小数)。

输入样例

-1 2 -3 4 -5

-1 2 -3 4

-1 2 3 4

输出样例

Case 1: (5), -0.60, -2.61

Case 2: (4), 0.50, 2.21

Case 3: (4), 2.00, none

#include <stdio.h>
#include <math.h>

double ave_numeric(double sum, int n)
{
    return (double)(sum/n);
}

void ave_geometric(double prod, int n)
{
    if(prod < 0 && (n == 0 || n%2 != 0))
        printf("%.2lf\n",-(double)pow(-prod, 1.00/n));

    else if (prod < 0 && (n != 0 && n%2 == 0))
        printf("none\n");

    else printf("%.2lf\n",(double)pow(prod, 1.00/n));
}

int main()
{
    double a[20];
    int i = 0,j , m = 1;

    while (scanf("%lf",&a[i]) == 1)
    {
        int flag = 1;
        double sum = a[0], prod = a[0];

        if(getchar() == '\n')
        {
            j = 1;
            printf("Case %d: (%d), %.2lf, ",m++,j, ave_numeric(sum,j));
            ave_geometric(prod,j);
        }


        else
        {
            for (j = 1;flag && scanf("%lf",&a[j]) == 1;j++)
            {
                sum += a[j];
                prod = prod * a[j];

                if(getchar() == '\n')
                    flag = 0;
            }

            printf("Case %d: (%d), %.2lf, ",m++,j, ave_numeric(sum,j));
            ave_geometric(prod,j);
        }
    }


    return 0;
}

08 计算和式

问题描述 用记号[dd]表示2位十进制数d×10+d;[ddd]表示3位十进制数d×100+d×10+d;以此类推。给定0~9之间的一个数码d,以及一个正整数n,计算不超过n项的和式d+[dd]+[ddd]+…+[dd],要求计算过程用long long数据类型且不发生溢出。例如:d为1,n为5时,计算1+11+111+1111+11111,结果为12345,其中实际求和项数为5。注意:如下测试样例3中,n为100,实际求和项数为19。

输入   输入数据有若干行,每行上有两个数据分别表示d和n,对应一种情形。

输出   参照输出样例输出结果。请注意①输出的s(d, m)中m是实际求和的项数;②冒号和逗号后、等号前后都有一个空格字符。

输入样例

1 9

1 19

1 100

输出样例

Case 1: s(1, 9) = 123456789

Case 2: s(1, 19) = 1234567901234567899

Case 3: s(1, 19) = 1234567901234567899

【提示】因为一些编译系统采用宏符号Long_Long_MAX,而另一些编译系统采用宏符号LLONG_MAX表示扩展的长整型(long long)数据的最大值。为了兼容不同编译系统,请参考如下代码

C语言

#include <stdio.h>

#include <limits.h>

#ifndef LONG_LONG_MAX

#define LONG_LONG_MAX LLONG_MAX

#define ULONG_LONG_MAX ULLONG_MAX

#endif

C++

#include <iostream>

#include <climits>

using namespace std;

#ifndef LONG_LONG_MAX

#define LONG_LONG_MAX LLONG_MAX

#define ULONG_LONG_MAX ULLONG_MAX

#endif

#include <stdio.h>
#include <limits.h>
#define LONG_LONG_MAX LLONG_MAX

int main()
{
    // 定义变量
    int i, j, k;
    int d, m, n, tmp;
    int a[25];

    j = 1;

    // 循环读入输入
    while (scanf("%d %d", &d, &n) == 2)
    {
        // 处理特殊情况:d为0的情况
        if (d == 0)
        {
            printf("Case %d: s(0, %d) = 0\n", j, n);
        }
        else
        {
            // 初始化a数组为0
            for (k = 0; k < 25; k++)
            {
                a[k] = 0;
            }

            // 根据题目要求,设置最大位数限制
            if ((d == 9 || d == 8) && n > 18)
            {
                m = 18;
            }
            else if (d < 9 && n > 19)
            {
                m = 19;
            }
            else
            {
                m = n;
            }

            // 计算结果
            for (i = m; i >= 1; i--)
            {
                tmp = i * d + a[m - i];
                a[m - i] = tmp % 10;
                a[m - i + 1] = tmp / 10;
            }

            // 输出结果
            printf("Case %d: s(%d, %d) = ", j, d, m);

            int flag = 0;
            for (i = m; i >= 0; i--)
            {
                if (a[i] != 0)
                {
                    flag = 1;
                }
                if (flag)
                {
                    printf("%d", a[i]);
                }
            }

            printf("\n");

            j++;
        }
    }
    return 0;
}

09 判断同构数

问题描述 给定一个十进制正整数,判断其是否为同构数。所谓同构数是这样的一些数,它出现在其平方数的右边,例如5是出现在$5^2=25$右边的数,25是出现在$25^2=625$右边的数,所以5和25都是同构数。

输入   输入数据有若干行。每行上有一个正整数,对应一种情形。

输出   对于每一种情形,先输出“Case #: ”(#为序号,从1起),然后输出n,逗号及空格,n的平方,逗号及空格,结果(Yes或No),换行。

输入样例

5

15

25

输出样例

Case 1: 5, 25, Yes

Case 2: 15, 225, No

Case 3: 25, 625, Yes

#include <stdio.h>
#include <math.h>

int main()
{
    int n1, n2;
    int m = 1;

    while(scanf("%d",&n1) == 1)
    {
        n1 = abs(n1);
        n2 = n1 * n1;

        int num = n2;

        int counts = 0;
        do
        {
            num = num/10;
            counts++;
        }while(num != 0);

        int flag = 0;
        for(int i = 1;i <= counts;i++)
        {
            if(n1 == (n2 % (int)(pow(10,counts-i))))
            {
                flag = 1;
                break;
            }
            else if(n1 != (n2 % (int)(pow(10,counts-i))))
                flag = 0;
        }

        if(flag == 1 || n1 == 1)
            printf("Case %d: %d, %d, Yes\n",m++,n1,n2);
        else
            printf("Case %d: %d, %d, No\n",m++,n1,n2);

    }

    return 0;
}

10 计算两个向量的点积

问题描述   给定两个向量,计算它们的点积(内积)。

输入   输入数据有若干行。每行上有两个向量(维数皆不超过20),对应一种情形。

输出   对于每一种情形,先输出"Case #: "(#为序号,从1起),然后输出结果(保留2位小数),当维数不同时,输出none。

输入样例

(1, 2, 3, 4, 5) (5, 4, 3, 2, 1)

(1, 2) (-2, 1)

(1, 2, 3) (1, 2)

输出样例

Case 1: 35.00

Case 2: 0.00

Case 3: none

#include <stdio.h>

int variables_input(int *vector, char ch)
{
    int i = 0;
    int n = 0;

    while(ch != ')')
    {
        if (ch == '(' || ch == ' ')
        {
            scanf("%d", vector + i);
            i++;
        }
        else if (ch == ',')
            n++;
        else if (ch == '-')
        {
            scanf("%d",vector + i);
            *(vector + i) = -*(vector + i);
            i++;
        }

        scanf("%c", &ch);

        if (ch == '\n')
            break;
    }
    *(vector + i) = '\0';

    return n + 1;
}

int main()
{
    
    int i;
    int x = 1;
    
    char ch;
    
    int vector1_dim, vector2_dim;
    int vector1[20], vector2[20];
    
    double answer;

    while(scanf("%c", &ch) == 1)
    {
        answer = 0.00;

        vector1_dim = variables_input(vector1, ch);

        if (vector1_dim == 0)
            break;

        scanf("%c", &ch);
        scanf("%c", &ch); 

        vector2_dim = variables_input(vector2, ch);

        if (vector1_dim == vector2_dim)
        {
            for (i = 0; i < vector1_dim; i++)
                answer += vector1[i] * vector2[i];
            
            printf("Case %d, %.2lf\n", x++, answer);
        }
        else printf("Case %d, none\n", x++);
    }

    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值