1018 锤子剪刀布 1019 数字黑洞
热死了
1018 锤子剪刀布 (20 分)
大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式:
输入第 1 行给出正整数 N(≤105),即双方交锋的次数。随后 N 行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C
代表“锤子”、J
代表“剪刀”、B
代表“布”,第 1 个字母代表甲方,第 2 个代表乙方,中间有 1 个空格。
输出格式:
输出第 1、2 行分别给出甲、乙的胜、平、负次数,数字间以 1 个空格分隔。第 3 行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有 1 个空格。如果解不唯一,则输出按字母序最小的解。
输入样例:
10
C J
J B
C B
B B
B C
C C
C B
J B
B C
J J
输出样例:
5 3 2
2 3 5
B B
题解:
#include<stdio.h>
int main()
{
int time;
scanf("%d", &time);
char A, B;
int wina[3] = { 0 };///0代表布B,1代表锤子C,2代表剪刀J
int winb[3] = { 0 };
char p[3] = { 'B','C','J' };
for (int i = 0; i < time; i++)
{
scanf("\n%c %c", &A, &B);
if (A == 'B')
{
if (B == 'B');
if (B == 'C')wina[0]++;
if (B == 'J')winb[2]++;
}
if (A == 'C')
{
if (B == 'B')winb[0]++;
if (B == 'C');
if (B == 'J')wina[1]++;
}
if (A == 'J')
{
if (B == 'B')wina[2]++;
if (B == 'C')winb[1]++;
if (B == 'J');
}
}
int sorcea = wina[0] + wina[1] + wina[2];
int sorceb = winb[0] + winb[1] + winb[2];
printf("%d %d %d\n", sorcea, time - sorcea - sorceb, sorceb);
printf("%d %d %d\n", sorceb, time - sorcea - sorceb, sorcea);
int maxa = wina[0];
int maxb = winb[0];
if (wina[1] > maxa)maxa = wina[1];
if (wina[2] > maxa)maxa = wina[2];
if (winb[1] > maxb)maxb = winb[1];
if (winb[2] > maxb)maxb = winb[2];
for (int i = 0; i < 3; i++)
{
if (wina[i] == maxa)
{
printf("%c ", p[i]);
break;
}
}
for (int i = 0; i < 3; i++)
{
if (winb[i] == maxb)
{
printf("%c", p[i]);
break;
}
}
}
总结:
自以为用数组写的还挺巧,没啥注意的
1019 数字黑洞 (20 分)
给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的 6174
,这个神奇的数字也叫 Kaprekar 常数。
例如,我们从6767
开始,将得到
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
... ...
现给定任意 4 位正整数,请编写程序演示到达黑洞的过程。
输入格式:
输入给出一个 (0,104) 区间内的正整数 N。
输出格式:
如果 N 的 4 位数字全相等,则在一行内输出 N - N = 0000
;否则将计算的每一步在一行内输出,直到 6174
作为差出现,输出格式见样例。注意每个数字按 4
位数格式输出。
输入样例 1:
6767
输出样例 1:
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
输入样例 2:
2222
输出样例 2:
2222 - 2222 = 0000
题解:
#include<stdio.h>
int cmpfunc1(const void* a, const void* b)
{
return (*(int*)b - *(int*)a);
}
int cmpfunc2(const void* a, const void* b)
{
return (*(int*)a - *(int*)b);
}
int main()
{
int input[4] = { 0 };
int result = 0;
int flag = 0;
scanf("%d", &result);
input[0] = result / 1000;
input[1] = result / 100 - input[0] * 10;
input[2] = result / 10 - input[0] * 100 - input[1] * 10;
input[3] = result - input[0] * 1000 - input[1] * 100 - input[2] * 10;
if (input[0]==input[1]&&input[2]==input[3]&&input[1]==input[2])
{
int numb = input[0];
printf("%d%d%d%d - %d%d%d%d = 0000",numb, numb, numb, numb, numb, numb, numb, numb);
return 0;
}
int a[4];
int b[4];
while(flag!=1||result!=6174)
{
flag = 1;
memcpy(a, input, 16);
memcpy(b, input, 16);
qsort(a, 4, sizeof(int), cmpfunc1);
qsort(b, 4, sizeof(int), cmpfunc2);
result = a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3] - b[0] * 1000 - b[1] * 100 - b[2] * 10 - b[3];
input[0] = result / 1000;
input[1] = result / 100 - input[0] * 10;
input[2] = result / 10 - input[0] * 100 - input[1] * 10;
input[3] = result - input[0] * 1000 - input[1] * 100 - input[2] * 10;
for (int i = 0; i < 4; i++)
{
printf("%d", a[i]);
}
printf(" - ");
for (int i = 0; i < 4; i++)
{
printf("%d", b[i]);
}
printf(" = ");
if (result == 6174)
{
printf("%d", result);
}
else
{
printf("%04d\n", result);
}
}
}
总结:
想用QSORT贪便宜的,结果越写越麻烦,数字转数组,数组转数字。
又有两种特殊情况,小于1000的要补0,数字相同的要直接打印,只能说不如自己写个快排方便。