/*项目:PAT (1011)给定区间[-231, 231]内的3个整数A、B和C,请判断A+B是否大于C
*作者:钱金柱
*日期:2018年4月7日 19:34
*/
#include<stdio.h>
int main(void)
{
int i, j, T, temp;
scanf("%d\n", &T);
long long a[T][3];
temp = T - 1;
for(i = 0; i <= temp; i++)
for(j = 0; j <= 2;j++)
scanf("%lld", &a[i][j]);
for(i = 0; i <= temp; i++)
{
if(a[i][0] + a[i][1] > a[i][2])
printf("Case #%d: true", i+1);
else
printf("Case #%d: false", i+1);
printf("\n");
}
return 0;
}
/*题号:1016. 部分A+B (15)
*作者:钱金柱
*日期:2018年4月7日 22:32
*题目描述:正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA。
现给定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
*/
#include<stdio.h>
int main()
{
int A, DA;
int B, DB;
int PA, PB;
int temp;
PA = 0;
PB = 0;
scanf("%d %d %d %d", &A, &DA, &B, &DB);
while(A != 0)
{
temp = A % 10;
A /= 10;
if(temp == DA)
PA = PA * 10 + DA;
}
while(B != 0)
{
temp = B % 10;
B /= 10;
if(temp == DB)
PB = PB * 10 + DB;
}
printf("%d\n", PA + PB);
return 0;
}
/*题号:1026. 程序运行时间(15)
*作者:钱金柱
*日期:2018年4月8日 9:55
*题目描述:要获得一个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
*/
#include<stdio.h>
#define CLK_TCK 100
int main()
{
int C1, C2;
double t = 0;
double times; //注意定义的数据类型与下面需求相匹配
double temp;
int ss = 0;
int mm = 0;
int hh = 0;
scanf("%d", &C1);
scanf("%d", &C2);
t = (C2 - C1);
times = t / CLK_TCK; //错误:times = (C2 - C1) / CLK_TCK,后面计算出的结果,
//以整形存储在times里面
//printf("%lf\n",times);
temp = times - (int)times;
//printf("%lf\n",temp);
if(temp >= 0.5)
ss = (int)times + 1;
else
ss = (int)times;
hh = ss / 3600;
mm = (ss - 3600 * hh) / 60;
ss = ss - 3600 *hh - 60 * mm;
printf("%02d:%02d:%02d\n", hh, mm, ss);
return 0;
}
/*题号:1046. 划拳(15)
*作者:钱金柱
*日期:2018年4月8日 14:19
*题目描述:划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。
下面给出甲、乙两人的划拳记录,请你统计他们最后分别喝了多少杯酒。
输入格式:
输入第一行先给出一个正整数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
*/
#include<stdio.h>
#define Debug 0
int main()
{
int drink1 = 0;
int drink2 = 0;
int N;
int i, j;
scanf("%d", &N);
int a[N][4];
for(i = 0; i <= (N - 1); i++)
{
for(j = 0; j <= 3; j++)
{
scanf("%d", &a[i][j]);
}
}
if (Debug) for(i = 0; i <= (N - 1); i++)
{
for(j = 0; j <= 3; j++)
{
printf("%d ", a[i][j]);
}
}
for(i = 0; i <= (N - 1); i++)
{
if((a[i][0] + a[i][2] == a[i][1]) && (a[i][0] + a[i][2] == a[i][3]))
{
if (Debug) printf("xiangtong");
continue;
}
else if(a[i][0] + a[i][2] == a[i][3])
drink1 += 1;
else if(a[i][0] + a[i][2] == a[i][1])
drink2 += 1;
}
printf("%d %d\n", drink1, drink2);
return 0;
}
/*题号:1008. 数组元素循环右移问题 (20)
*作者:钱金柱
*日期:2018年4月9日 22:30
*题目描述:一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数
循环向右移M(M>=0)个位置,即将A中的数据由(A0 A1……AN-1)变换为(AN-M …… AN-1 A0 A1……AN-M-1)
(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:每个输入包含一个测试用例,第1行输入N ( 1<=N<=100)、M(M>=0);第2行输入N个整数,
之间用空格分隔。
输出格式:在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4
*/
#include<stdio.h>
int main(void)
{
int N;
int M;
int i;
int T;
scanf("%d", &N);
scanf("%d", &M);
int a[N];
for(i = 0; i < N; i++)
{
scanf("%d", &a[i]);
}
/*
for(i = 0; i < N; i++)
{
printf("%d \n", a[i]); //代码调试
}
printf("%d", N-M);
*/
if(N > M) //第一种情况 N 大于 M
{
for(i = N - M; i <= (N - 1); i++)
{
printf("%d ", a[i]); //先打印出a[N-M]--a[N-1],注意每次打印数组中的元素
//都留一个空格
}
for(i =0; i <= (N - M - 2); i++)
{
printf("%d ", a[i]); //再打印出a[0]--a[N-M-2]
}
printf("%d\n", a[N - M - 1]); //为什么要单独打印最后一个数呢?根据题目要求序列最后
//不能留空格,故满足格式要求,单独打印a[N-M-1]
}
else if(N <= M) //第二种情况:M 大于等于 N
{
/*
for(T = M - N; T > N; T = T - N) //等效于T = M % N;(错)
{
continue; //调试发现这样做存在一个测试点是有问题的
} //有心的人可以考虑下
*/
T = M % N; //比起上面用一个循环来做,这样更加节省时间
//数组元素每次向右移动 N 的整数倍,整个数组没变,
//因此用T = M % N 确定最后移动的次数T,这个数比N
//小,相当于第一种情况下M,下面打印数组就是重复一下。
for(i = N - T; i <= (N - 1); i++)
{
printf("%d ", a[i]);
}
for(i =0; i <= (N - T - 2); i++)
{
printf("%d ", a[i]);
}
printf("%d\n", a[N - T - 1]);
}
return 0; //最后虽然没有移动数组里的元素位置,但是打印出的结果
//是满足题意的。
}