猜数字(数组)

有如下一组数字,其中每个数字都在 1 ~ 63 之间,

 1  3  5  7  9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63
 2  3  6  7 10 11 14 15 18 19 22 23 26 27 30 31 34 35 38 39 42 43 46 47 50 51 54 55 58 59 62 63
 4  5  6  7 12 13 14 15 20 21 22 23 28 29 30 31 36 37 38 39 44 45 46 47 52 53 54 55 60 61 62 63
 8  9 10 11 12 13 14 15 24 25 26 27 28 29 30 31 40 41 42 43 44 45 46 47 56 57 58 59 60 61 62 63
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

现在需要编写一个程序,当从键盘输入某数字在且仅在哪几行出现了,该程序可以“猜”出这个数字是几。

输入:

    程序的输入是一串以空白符分开的数字,当输入 0 时表示输入结束。

输出:

    输出猜到的数字。

#include <stdio.h>
int arr[6][32] = {{1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61,63},
	{2,3,6,7,10,11,14,15,18,19,22,23,26,27,30,31,34,35,38,39,42,43,46,47,50,51,54,55,58,59,62,63},
	{4,5,6,7,12,13,14,15,20,21,22,23,28,29,30,31,36,37,38,39,44,45,46,47,52,53,54,55,60,61,62,63},
	{8,9,10,11,12,13,14,15,24,25,26,27,28,29,30,31,40,41,42,43,44,45,46,47,56,57,58,59,60,61,62,63},
	{16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63},
	{32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63}};//预先输入数字
int flag[6][64] = {0};//用于记录每一行中那个数字出现了,该数字就是数组的下标
int line[6] = {0};
int main()
{
	int n = 0;
	scanf("%d",&n);
	int i = 0;
	int j = 0;
	for (i = 0; i < 6; i++)
	{
		for (j = 0; j < 32; j++)//每行32个数
		{
			flag[i][arr[i][j]] = 1;//表示第i+1行arr[i][j]出现
		}
	}//表示每一行的数字是否有出现1-63中的数字
	while (n)
	{
		line[n -1] = 1;//表示输入的行是哪一行
		scanf("%d",&n);
	}
	for (j = 1; j < 64; j++)//对flag中的每个元素遍历
	{
		int endnum = 0;
		for(int k=0;k<i;k++)
		{ 
			if (line[k])//输入的要出现的行数(k从0开始)
			{
				if (flag[k][j])//如果j出现,endnum=1
				{
					endnum = 1;
				}
				else//如果没有出现就找下一个元素:j+1
				{
					endnum = 0;
					break;
				}
			}
			else//其他行不出现某个元素
			{
				if (!flag[k][j])//如果不出现,flag[i][j]=0;!flag[i][j]=1;这一元素符合条件
				{
					endnum = 1;
				}
				else//出现就开始下一个元素的检查
				{
					endnum = 0;
					break;
				}
			}
		}
		if (endnum)//如果最终的这个j满足条件,也就是endnum==1,就输出,然后结束程序
		{
			printf("%d\n", j);
			break;
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值