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,数字相同的要直接打印,只能说不如自己写个快排方便。

posted @ 2022-04-06 21:09  huigugu  阅读(52)  评论(0编辑  收藏  举报