算法笔记第三章练习题_A+B和C,部分A+B,程序运行时间,划拳
作者:互联网
部分A+B问题描述:
正整数 A 的“DA(为 1 位整数)部分”定义为由 A 中所有 DA 组成的新整数 PA。例如:给定 A=3862767,DA=6,则 A 的“6 部分”PA 是 66,因为 A 中有 2 个 6。
现给定 A、DA、B、DB,请编写程序计算 PA+PB。
输入格式:
输入在一行中依次给出 A、DA、B、DB,中间以空格分隔,其中 0<A,B<1010。
输出格式:
在一行中输出 PA+PB 的值。
输入样例 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,107]。
输出格式:
在一行中输出被测函数运行的时间。运行时间必须按照 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
给定区间 [−231,231] 内的 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