| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1792 人关注过本帖
标题:猜数字游戏问题
只看楼主 加入收藏
wuxiami
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2022-7-17
收藏
得分:0 
回复 10楼 rjsp
这会又搞出来一个绝对的问题  根据我实验  推出答案是7087
但是输入0700输出一个0正确4位置错误

输入四位数字0000
有1个数字完全符合,有3个数字位置错误         这一句推出有1个0
输入四位数字1111
有0个数字完全符合,有0个数字位置错误
输入四位数字2222
有0个数字完全符合,有0个数字位置错误
输入四位数字333
有0个数字完全符合,有1个数字位置错误
输入四位数字3333
有0个数字完全符合,有0个数字位置错误
输入四位数字4444
有0个数字完全符合,有0个数字位置错误
输入四位数字5555
有0个数字完全符合,有0个数字位置错误
输入四位数字6666
有0个数字完全符合,有0个数字位置错误        
输入四位数字7777
有2个数字完全符合,有2个数字位置错误           这一句退出两个7
输入四位数字8888
有1个数字完全符合,有3个数字位置错误        这一句退出1个8     得出四个数字为0778  但是不知道顺序  继续排查
输入四位数字0778
有0个数字完全符合,有4个数字位置错误
输入四位数字7708
有1个数字完全符合,有3个数字位置错误
输入四位数字8077
有2个数字完全符合,有2个数字位置错误
输入四位数字0111
有0个数字完全符合,有1个数字位置错误
输入四位数字1011
有1个数字完全符合,有0个数字位置错误
输入四位数字1101
有0个数字完全符合,有1个数字位置错误
输入四位数字1110
有0个数字完全符合,有1个数字位置错误
输入四位数字7666
有1个数字完全符合,有1个数字位置错误
输入四位数字6667
有1个数字完全符合,有1个数字位置错误
输入四位数字0700
有0个数字完全符合,有4个数字位置错误            这一句什么情况??明显有问题了
输入四位数字



[此贴子已经被作者于2022-8-25 21:00编辑过]

2022-08-25 20:51
wuxiami
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2022-7-17
收藏
得分:0 
回复 11楼 wuxiami
有2个数字完全符合,有4个数字位置错误
输入四位数字1111
有0个数字完全符合,有0个数字位置错误
输入四位数字2222
有0个数字完全符合,有0个数字位置错误
输入四位数字3333
有0个数字完全符合,有0个数字位置错误
输入四位数字4444
有0个数字完全符合,有0个数字位置错误
输入四位数字5555
有1个数字完全符合,有3个数字位置错误
输入四位数字6666
有1个数字完全符合,有3个数字位置错误
输入四位数字0056
有1个数字完全符合,有4个数字位置错误
输入四位数字0011
有1个数字完全符合,有2个数字位置错误
输入四位数字1001
有1个数字完全符合,有2个数字位置错误
输入四位数字1100
有1个数字完全符合,有2个数字位置错误
输入四位数字1010
有0个数字完全符合,有2个数字位置错误
输入四位数字0101
有2个数字完全符合,有2个数字位置错误
输入四位数字0501
有2个数字完全符合,有3个数字位置错误
输入四位数字0105
有3个数字完全符合,有2个数字位置错误
输入四位数字0606
有3个数字完全符合,有3个数字位置错误
输入四位数字0506
有2个数字完全符合,有4个数字位置错误              这句  
输入四位数字0605
恭喜!经过17次尝试,您答对了!
2022-08-25 21:16
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
回复 11楼 wuxiami
你调试时在  x = rand() % 9999; 后面用 printf 把 x 输出来,就不需要瞎猜了
然后你就可以贴出“x等于多少,n等于多少时,输出什么,应当是什么”,别人就可以帮你查错
2022-08-25 21:20
纯蓝之刃
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:76
帖 子:566
专家分:3690
注 册:2019-7-29
收藏
得分:7 
回复 10楼 rjsp
我认为这样应该合理些:
假设x是8683,n是3688。
第二个和第三个数字一样,有2个数字完全符合。
刨除2.3位,8683剩余第一位的8和第四位的3,3688剩余第一位的3和第四位的8,
3688剩余第一位的3在8683剩余第一位的8和第四位的3中出现,数字位置错误数量加1,
8683剩余第一位的8未匹配,3688剩余第四位的8在8683剩余未匹配中出现,数字位置错误数量加1。
结果 有2个数字完全符合,有2个数字位置错误。

一沙一世界,一花一天堂。无限掌中置,刹那成永恒。
2022-08-26 08:39
wuxiami
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2022-7-17
收藏
得分:0 
有没有更好的逻辑,能让这种情况下提示2个数字位置错误
2022-08-26 09:01
纯蓝之刃
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:76
帖 子:566
专家分:3690
注 册:2019-7-29
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <time.h>
#include <string.h>

struct position
{
    unsigned char state;    //0.未匹配,1.已匹配
    unsigned char val;
};

int main()
{
    struct position right[4],cur[4];
    int x,a,b,n,i,j;                       //输入的数
    int s = 0;                       //输入次数
    srand(time(0));
    x=rand() % 9999;

    right[0].val = x % 10;
    right[1].val = x / 10 % 10;
    right[2].val = x / 100 % 10;
    right[3].val = x / 1000;

    printf("值=%d\n",x);
    while(1)
    {
        printf("输入四位数字:");
        scanf("%d", &n);

        if (n == x)                    //猜的数字和生成随机数一样

        {
            printf("恭喜!经过%d次尝试,您答对了!\n", s);
            break;// exit(0);                                       //结束循环
        }
        else  //不一样的话  直接拆位
        {
            a = 0;                        //完全符合
            b = 0;                          //放置错误

            cur[0].val = n % 10;
            cur[1].val = n / 10 % 10;
            cur[2].val = n / 100 % 10;
            cur[3].val = n / 1000;
            for(i=0; i<4; i++)
            {
                if(right[i].val==cur[i].val)
                {
                    right[i].state=1;
                    cur[i].state=1;
                    a++;
                }
                else
                {
                    right[i].state=0;
                    cur[i].state=0;
                }
            }
            for(i=0; i<4; i++)
            {
                if(cur[i].state==0)
                {
                    for(j=0; j<4; j++)
                    {
                        if(right[j].state==0 && cur[i].val==right[j].val)
                        {
                            cur[i].state=1;
                            right[j].state=1;
                            b++;
                            break;
                        }
                    }
                }
            }

            printf("有%d个数字完全符合,有%d个数字位置错误\n", a, b);
            s++;//次数增加
        }
    }

    return 0;
}

一沙一世界,一花一天堂。无限掌中置,刹那成永恒。
2022-08-26 09:06
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
回复 14楼 纯蓝之刃
你说得很对,所以我一直想知道题目作者真实的意图是什么,但是题目作者太混

以下是题目要求
一个猜数字的游戏,数字为4位,用户输入后,计算机进行判断,如果猜测的不正确,计算机要告诉用户,用户猜的数字,其中有几个数字的数值和位置是和正确的数字是一样的,有几个数字的数值和正确的数字一样,但是位置不一样。
如正确的数字为7258
      用户输入1349的时候,计算机弹出提示:有0个数字完全符合,有0个数字位置错误
      用户输入1347的时候,计算机弹出提示:有0个数字完全符合,有1个数字位置错误
      用户输入7081的时候,计算机弹出提示:有1个数字完全符合,有1个数字位置错误
      用户输入2222的时候,计算机弹出提示:有1个数字完全符合,有3个数字位置错误
      用户输入8275的时候,计算机弹出提示:有1个数字完全符合,有3个数字位置错误
      用户输入7258的时候,计算机弹出提示:恭喜!经过6次尝试,您答对了!

可惜根据以上信息,完全推导不出“x=8683, n=3688” 时应该输出“有2个数字完全符合,有3个数字位置错误”还是“有2个数字完全符合,有2个数字位置错误”
所以我只能根据题主贴的代码来认为他的输出是正常的,否则假如我能确认题目作者的意图是“x=8683, n=3688时,有2个数字完全符合,有2个数字位置错误”的话,就可以理直气壮地说“那是因为你的代码写得不符合题意”
2022-08-26 09:19
wuxiami
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2022-7-17
收藏
得分:0 
回复 10楼 rjsp
#include <stdio.h>  
 
int main()
{

    int x;     //随机生成数
    int n = 0; //输入的数
    int s = 0; //输入次数
    int a;     //完全符合
    int b;     //位置错误
    int n4[4]; // n的各个数位
    int x4[4]; // x的各个数位
    int flag[4] = { 0 };
    srand(time(0)); //让随机生成数不重复
    x = rand() % 9999;
    for (;;)
    {
        
        printf("输入四位数字:");
        scanf_s("%d", &n);
        s++; //输入次数增加

        x4[0] = x % 10;
        x4[1] = x / 10 % 10;
        x4[2] = x / 100 % 10;
        x4[3] = x / 1000;

        a = 0; //初始化
        b = 0; //初始化

        for (int i = 0; i < 4; i++)
            flag[i] = -1;
        if (n == x) //猜的数字和生成随机数一样

        {
            printf("恭喜!经过%d次尝试,您答对了!\n", s);
            break; // exit(0);                                       //结束循环
        }
        else
        { //不一样的话  直接拆位
            n4[0] = n % 10;
            n4[1] = n / 10 % 10;
            n4[2] = n / 100 % 10;
            n4[3] = n / 1000;

            for (int i = 0; i < 4; i++) //遍历x的四位数
            {
                for (int j = 0; j < 4; j++) // 遍历n的四位数
                {
                    if (x4[i] == n4[j]) //数字相等
                    {
                        if (i == j) //位置相同,
                        {
                            a++;
                            if (flag[j] != -1) //如果该位置被占用,则 b--,
                                b--;
                            flag[j] = i; //设置位置标记
                        }
                        else if (flag[j] == -1) // 位置不同
                        {
                            b++;
                            flag[j] = i;
                        }
                    }
                }
            }

            printf("有%d个数字完全符合,有%d个数字位置错误\n", a, b);
        }
    }
}

大佬们酱紫  可以实现 哎 搞的头大
2022-08-28 21:24
快速回复:猜数字游戏问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019962 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved