北理工46. 猜数字

46. 猜数字

有如下一组数字,其中每个数字都在 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 时表示输入结束。

输出:

    输出猜到的数字。

  测试输入 期待的输出 时间限制 内存限制 额外进程
测试用例 1 以文本方式显示
  1. 1 2 0↵
以文本方式显示
  1. 3↵
1秒 64M 0
测试用例 2 以文本方式显示
  1. 2 1 0↵
以文本方式显示
  1. 3↵
1秒 64M 0
测试用例 3 以文本方式显示
  1. 2 4 0↵
以文本方式显示
  1. 10↵
1秒 64M 0

 

首先是在数据之间插入','的代码,这是一个6*32的数据

第一版代码
char s[200] = {0};
    int i = 0;
    gets(s);
    while (strcmp(s,QUIT)) {        
        for (i = 2; i < 3 * 32; i += 3)
            s[i] = '\0';
        for (i = 0; i < 3 * 32; i += 3) {
            int t = atoi(&s[i]);
            printf("%d,", t);
        }
        putchar('\n');
        gets(s);

最后经过修改,得出下述代码来添加','

#include <stdio.h>
int main(void)
{
    char ch;
    int n;
    do {
        scanf("%d", &n);
        printf("%d,", n);
    } while ((ch = getchar()) != '\n');
    printf("\b \n");    
    return 0;
}

 

然后剩下的就是很寻常的事,略过去了

#include <stdio.h>
int main(void)
{
    /*首先遇到的一个大问题就是这个题目的数据太多了
    * 我可不想一个个的输入,于是首先要编写一个程序来帮我在数据之间插入','
    * 用二维数组存储这些数据
    * 然后建立一个大小为64的数组,记为桶数组
    * 假设输入1,则遍历第一行,遇到的每一个元素都在对应的桶数组上++
    * 比如,第一行是 3 4 5,tong[3]++,tong[4]++,tong[5]++
    * 最后统计出现次数,比如tong[14] = 2,表明14在两次的输入数据中都出现了
    */
    
    int data[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 record[64] = {0};
    int std[64] = { 0 };
    int t = 0,counter=0;
    do {
        scanf("%d", &t);
        if (t != 0) {
            for (int i = 0; i < 32; i++) record[data[t - 1][i]]++;
            counter++;
        }
    } while (t != 0);
    for (int i = 0; i < 6; i++)
        for (int j = 0; j < 32; j++)
            std[data[i][j]]++;
    for (int i = 0; i < 64; i++)          
        if (record[i] == std[i]&& record[i] == counter) printf("%d\n", i);       
    return 0;
}

 

posted @ 2022-12-13 17:33  我千五可以  阅读(353)  评论(0)    收藏  举报