编程语言
首页 > 编程语言> > 算法笔记第三章练习题_A+B和C,部分A+B,程序运行时间,划拳

算法笔记第三章练习题_A+B和C,部分A+B,程序运行时间,划拳

作者:互联网

部分A+B问题描述:

正整数 A 的“D​A​​(为 1 位整数)部分”定义为由 A 中所有 D​A​​ 组成的新整数 P​A​​。例如:给定 A=3862767,D​A​​=6,则 A 的“6 部分”P​A​​ 是 66,因为 A 中有 2 个 6。

现给定 A、D​A​​、B、D​B​​,请编写程序计算 P​A​​+P​B​​。
输入格式:

输入在一行中依次给出 A、D​A​​、B、D​B​​,中间以空格分隔,其中 0<A,B<10​10​​。
输出格式:

在一行中输出 P​A​​+P​B​​ 的值。
输入样例 1:

3862767 6 13530293 3

输出样例 1:

399

输入样例 2:

3862767 1 13530293 8

输出样例 2:

0

思路:

枚举PA的每一位,如果与DA相同,就执行 PA = PA * 10 +DA。PB同理可得,最后输出PA+PB。

为了简化代码定义一个函数getP()。注意题目的范围是1010,所以用long long定义A和B。

#include <cstdio>
int main()
{
    long long a,b,da,bd;
    scanf("%lld%lld%lld%lld",&a,&b,&da,&bd);
    long long pa = 0,pb = 0;
    while (a%10 == da)         //枚举a的每一位,%10的意思是每次取最低位
    {

        pa = pa * 10 +da;       //如果当前位为da,给pa增加一位pa
        a = a/10;               // /10的意思是每次取前(n-1)位
    }
    while (b%10 == bd)
    {

        bd = bd*10+bd;
        b = b /10;
    }
    printf("%lld\n",pa+pb);
    return 0;
}

程序运行时间题目描述:

要获得一个 C 语言程序的运行时间,常用的方法是调用头文件 time.h,其中提供了 clock() 函数,可以捕捉从程序开始运行到 clock() 被调用时所耗费的时间。这个时间单位是 clock tick,即“时钟打点”。同时还有一个常数 CLK_TCK,给出了机器时钟每秒所走的时钟打点数。于是为了获得一个函数 f 的运行时间,我们只要在调用 f 之前先调用 clock(),获得一个时钟打点数 C1;在 f 执行完成后再调用 clock(),获得另一个时钟打点数 C2;两次获得的时钟打点数之差 (C2-C1) 就是 f 运行所消耗的时钟打点数,再除以常数 CLK_TCK,就得到了以秒为单位的运行时间。

这里不妨简单假设常数 CLK_TCK 为 100。现给定被测函数前后两次获得的时钟打点数,请你给出被测函数运行的时间。
输入格式:

输入在一行中顺序给出 2 个整数 C1 和 C2。注意两次获得的时钟打点数肯定不相同,即 C1 < C2,并且取值在 [0,10​7​​]。
输出格式:

在一行中输出被测函数运行的时间。运行时间必须按照 hh:mm:ss(即2位的 时:分:秒)格式输出;不足 1 秒的时间四舍五入到秒。
输入样例:

123 4577973

输出样例:

12:42:59

思路:

这题目的是模拟clock()函数,给出两个数c1,c2(机器打点数),然后c2-c1计算出相差的打点数,由于1s内打点100次(CLK_TCK = 100),差值换算成s就是(c2-c1)/CLK_TCK。

# include <cstdio>
int main()
{

    int c1,c2;
    scanf("%d%d",&c1,&c2);
    int ans = c2 - c1;               //按题目要求作差
    if(ans %100 >=50)                //四舍五入操作
    {
        ans = ans/100+1;
    }
    else
    {

        ans = ans/100;
    }
    printf("%02d:%02d:02d\n",ans /3600,ans % 3600/60,ans%60);
    return 0;
}
/*
给出起始时间C1和终止时间C2,单位均为CLK_TCK(1s = 200CLK_TCK),求出C1 C2相聚时间,其结果按四舍五入精确到S
其中当C2 -C1的末两位不少于50时,说明C2 -C1需要进位 

划拳题目描述:

酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。

下面给出甲、乙两人的划拳记录,请你统计他们最后分别喝了多少杯酒。

输入格式:

输入第一行先给出一个正整数 N(≤100),随后 N 行,每行给出一轮划拳的记录,格式为:

甲喊 甲划 乙喊 乙划

其中是喊出的数字,是划出的数字,均为不超过 100 的正整数(两只手一起划)。

输出格式:

在一行中先后输出甲、乙两人喝酒的杯数,其间以一个空格分隔。

输入样例:

5
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15

输出样例:

1 2

思路:

甲赢:a2=a1+b1 且 b2≠a1+b1    乙赢:a2≠a1+b1 且 b2=a1+b1

# include <cstdio>
int main()
{

    int n,failA = 0,failB = 0;          //甲乙输的次数
    scanf("%d",&n);                     //记录条数
    for ( int i = 0;i < n;i++)
    {
        int a1,a2,b1,b2;
        scanf("%d%d%d%d",&a1,&a2,&b1,&b2);  //甲喊甲划乙喊乙划
        if(a1 + b1 ==a2 &&a1 + b1!= b2)      //甲猜中乙没有猜中
        {

            failB++;
        }
        else if (a1 + b1 ==b2 &&a1 + b1!=a2)
        {
            failA++;
        }
    }
    printf("%d %d\n",failA,failB);              //输出结果
}
/*
注
设计一个全局变量 failA 和failB来记录甲乙输的次数
判断条件中要注意甲乙两人都猜中的情况

A+B和C

给定区间 [−2​31​​,2​31​​] 内的 3 个整数 A、B 和 C,请判断 A+B 是否大于 C。
输入格式:

输入第 1 行给出正整数 T (≤10),是测试用例的个数。随后给出 T 组测试用例,每组占一行,顺序给出 A、B 和 C。整数间以空格分隔。
输出格式:

对每组测试用例,在一行中输出 Case #X: true 如果 A+B>C,否则输出 Case #X: false,其中 X 是测试用例的编号(从 1 开始)。
输入样例:

    4
    1 2 3
    2 3 4
    2147483647 0 2147483646
    0 -2147483648 -2147483647

输出样例:

    Case #1: false
    Case #2: true
    Case #3: true
    Case #4: false
 

# include <cstdio>
int main()
{

    int T,tcase = 1;
    scanf("%d",&T);        //输入数据组数
    while(T--)             //循环T次
    {
        long long a,b,c;
        scanf("%lld%lld%lld",&a,&b,&c);
        if(a + b > c)
        {

            printf("Case#%d:true\n",tcase++);
        }
        else
        {

            printf("case#%d:false\n",tcase++);
        }
    }
    return 0;
}
/*
注:最大值超过int 型所以变量的数据类型为longlong型,输入输出类型也是%lld
    while (T--)循环的是T次 而--T循环的是T-1次

 

标签:练习题,10,程序运行,划拳,int,样例,a1,输出,b1
来源: https://blog.csdn.net/weixin_42166771/article/details/101210459