应天论坛

 找回密码
 参与我们

QQ登录

只需一步,快速开始

搜索
查看: 1166|回复: 0

12个球的程序.....

[复制链接]

276

主题

303

帖子

3187

积分

管理员

湘南小侠客

Rank: 9Rank: 9Rank: 9

积分
3187

优质服务勋章论坛元老

QQ
发表于 2017-4-25 23:36:15 | 显示全部楼层 |阅读模式
微软的一道题目...
有12个外表一模一样的小球,其中有一个的质量和其他11个球不一样(11个球的质量完全相同),而且该球不知道是轻点还是重点。现在给你一个天平(无砝码),只有3次测量机会,请你找出该球。球号从a到l(小写)

[mw_shl_code=c,true]#include <stdio.h>
#include<time.h>
#include<stdlib.h>

#define LETTER_HEAD 97      //a的起始
#define BALL_NUM 12         //球个数
#define NORMAL_WEIGHT 2     //一般球的重量
#define HIGH_WEIGHT 3       //球超重
#define LOW_WEIGHT 1        //球失重...
#define LOOP 3              //循环次数(可称几次)
#define FALSE -1        
#define TRUE 0

int badBallWeight;
char badBall;


//得到坏球的字符
char getBadBall()
{
    srand((unsigned)time(NULL));
    return (char)(random()%BALL_NUM+LETTER_HEAD);
}

//得到坏球的重量
void getBadBallWeight()
{
    int type;
    srand((unsigned)time(NULL));
    type = random()%2;
   
    if(1==type)
    {   
        badBallWeight = HIGH_WEIGHT;
    }
    else
    {
        badBallWeight = LOW_WEIGHT;
    }
}


//开启了debug后 返回FALSE
int debug(char* str)
{
    if(strcmp(str, "exit") == 0)
    {
        exit(0);
    }

    if(strcmp(str, "cheat") == 0)
    {
        printf("CHEAT : bad ball is %c, weight is %d\n", badBall, badBallWeight);
        return FALSE;
    }

    return TRUE;
}

//验证球的名字,不在a-l之间的返回FALSE
int verifyBallsName(char* str)
{
    char* p;
   
    for(p = str; *p != '\0'; p++)
    {
        if(*p<'a' || *p>'l')
        {
            return FALSE;
        }
    }
   
    return TRUE;
}


//验证一侧的球有无重复,重复返回FALSE
int verifySingleRepeat(char* str)
{
    char* p, *temp;
    int repeat;
   
    for(p = str; *p != '\0'; p++)
    {
        repeat = 0;
        for(temp = str; *temp != '\0'; temp++)
        {
            if(*p == *temp)
                repeat++;   
            
        }
        
        if(repeat > 1)
            return FALSE;
    }
   
    return TRUE;
}

//验证一侧的错误性 有错打印并返回FALSE,无错返回有几个球
int verifySingle(char* str)
{
    int err;

    err = debug(str);
    if(FALSE == err)
        return FALSE;
   
    err = verifyBallsName(str);
    if(FALSE == err)
    {
        printf("\nERROR: balls name error (Usage:abcdefghijkl)\n");
        return FALSE;
    }
   
    err = verifySingleRepeat(str);
    if(FALSE == err)
    {
        printf("\nERROR: balls name repeat\n");
        return FALSE;
        
    }
   
    return TRUE;
}

//得到单侧的重量
int getSingleWeight(char* str)
{
    int ballsNum, haveBadBall;
    char* p;
   
    ballsNum = strlen(str);
    haveBadBall = 0;
   
    for(p = str; *p != '\0'; p++)
    {
        if(*p == badBall)   
            haveBadBall++;
    }
   

    return ((ballsNum-haveBadBall)*NORMAL_WEIGHT+haveBadBall*badBallWeight);

}

int verifyMultiBallName(char* leftStr, char* rightStr)
{
    char *l, *r;
   
    for(l = leftStr; *l != '\0'; l++)
    {
        for(r = rightStr; *r != '\0'; r++)
        {
            if(*l == *r)
                return FALSE;
        }
    }
   
    return TRUE;
}


int main()
{
    int loopTime, err;
    int leftWeight, rightWeight;
    char left[128],right[128];
    char bad[16];
   
    printf("有12个外表一模一样的小球,其中有一个的质量和其他11个球不一样(11个球的质量完全相同),\
    而且该球不知道是轻点还是重点。现在给你一个天平(无砝码),只有3次测量机会,请你找出该球。球号从a到l(小写)\n");
    badBall = getBadBall();
    getBadBallWeight();
        
    for(loopTime = 1; loopTime <= LOOP; loopTime++)
    {
        printf("pls input left balls:   ");
        scanf("%s", left);   
        
        err = verifySingle(left);
        if(FALSE == err)
            goto error;
               
        leftWeight = getSingleWeight(left);
        
        printf("pls input right balls:   ");
        scanf("%s", right);

        err = verifySingle(right);
        if(FALSE == err)
            goto error;
        
        rightWeight = getSingleWeight(right);
        
        err = verifyMultiBallName(left, right);
        if(FALSE == err)
        {
            printf("\nERROR: one ball both in left and right\n");
            goto error;
        }
        
        if(leftWeight > rightWeight)
        {
            printf("result %d : left > right\n", loopTime);
        }
        else if(leftWeight < rightWeight)
        {
            printf("result %d : left < right\n", loopTime);
        }
        else
        {
            printf("result %d : left = right\n", loopTime);
        }
        
        continue;
error:
        loopTime--;
    }
   
    printf("pls input the bad ball name:");
   
    scanf("%s", bad);
    if(*bad == badBall)
    {
        printf("\ncongratulation,your selected is right!\n");
    }
    else
    {
        printf("\nsorry,your selected is wrong!\n");
    }
   
    return 0;
}[/mw_shl_code]
每次见你穿短裤打领带,还穿个拖鞋,下次再这样穿不要从我家门口过了!
http://gsh.yzqz.cn/CassettePlayer/index.html

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 参与我们

本版积分规则

QQ|Archiver|手机版|小黑屋|应天社区 ( 湘ICP备17015224号 )

GMT+8, 2024-4-29 12:51 , Processed in 0.464814 second(s), 31 queries .

Powered by Discuz!

© 2001-2017 Comsenz Inc.


免责声明:
本站所发布的第三方软件及资源(包括但不仅限于文字/图片/音频/视频等仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢某程序或某个资源,请支持正版软件及版权方利益,注册或购买,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To: admin@yzqz.cn

快速回复 返回顶部 返回列表