当前位置: 首页 > 知识库问答 >
问题:

如何确定用户抽签中的一位数字是否与彩票号码中的一位数字匹配?

傅皓君
2023-03-14

问题:编写一个c程序,允许用户随心所欲地玩彩票。该程序随机生成一个两位数的彩票,提示用户输入一个两位数的号码,并根据以下规则确定用户是否中奖:

  1. 如果用户的选择与彩票号码的确切顺序匹配,则赌注为P8000
  2. 如果用户选择的所有数字与彩票号码中的所有数字匹配,则赌注为P5000
  3. 如果用户选择的数字中有一位与彩票号码中的一位匹配,则赌注为P2000

所需知识:生成随机数、比较数字、使用布尔运算符、选择和循环结构。

我被第三个要求困住了,你能帮忙吗?

这是我目前的代码。。。

#include <stdio.h>
#include <stdlib.h>
int main()
{
    srand((unsigned)time(0));
    int guess, guess2, lottoNum2, lottoNum3, lottoNum4, ones;
    int lottoNum = rand() % 100;

    printf("The lottery number is %d\n", lottoNum);

    printf("Enter your lottery pick (two digits): ");
    scanf("%d", &guess);

    if (guess == lottoNum)
        printf("\nExact match: you win P8,000");

    while (lottoNum != 0)
    {
        ones = lottoNum % 10;
        lottoNum2 = lottoNum2 * 10 + ones;
        lottoNum /= 10;
    }
    if (guess == lottoNum2)
        printf("\nMatch all digits: you win P5000\n");

    while (lottoNum != 0)
    {
       

    if (guess != lottoNum)
    printf("\nSorry, there is no digit match!");
}

共有2个答案

羿宏硕
2023-03-14

将其分解为1和10位数比尝试将其重新组合起来更简单。您需要这样做来检查它们是否完全匹配,所以为什么不将其用于整个事情。

#include<stdio.h>
#include<stdlib.h>
int main(){
    srand(time(NULL));
    int guess=0;
    while(1){
        int lotto = rand()%90 + 10;
        //Creates 2 digit number
        int l_1 = lotto%10;
        int l_10 = lotto/10;
        printf("Lotto# %d\n",lotto);
        printf("Enter 100 to quit");
        printf("Enter a 2 digit number:");
        scanf("%d",&guess);
        int g_1= guess%10;
        int g_10 = guess/10;
        if(guess==100)break;
        if(g_1==l_1 && g_10==l_10){
            printf("Exact match: You win P8000\n");
        }
        else if(g_1==l_10 && g_10==l_1){
            printf("All numbers matched: You win P5000\n");
        }
        else if(g_1==l_1 || g_10==l_10 || g_1==l_10 || g_10==l_1){
            printf("One number matched: You win P2000\n");
        }
        else {printf("You lost no numbers matched\n");}
    }
    return 0;
}
衡丰茂
2023-03-14

我是这样解决的:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int first_digit();
int second_digit();

int main()
{
    int key = 1;
    while(key!=0){
        
        srand((unsigned)time(0));
        int guess=0;
        int temp=0;
        int lottoNum = rand() % 100;
    
        printf("The lottery number is %d\n", lottoNum);
        scanf("%d", &guess);
        
        int guess_digit1=0, guess_digit2=0, lotto_digit1=0, lotto_digit2=0;
    
        guess_digit2 = guess%10;
        guess_digit1 = (guess - guess_digit2) / 10;
        
        lotto_digit2 = lottoNum%10;
        lotto_digit1 = (lottoNum - lotto_digit1) / 10;
        
       
        int sentinel = 1; //sentinel=1 game on | sentinel=0 game over
        
        if (guess == lottoNum){
            printf("\nExact match: you win P8,000");
            sentinel = 0;
        }
           
        if((lotto_digit1 == guess_digit2) && (lotto_digit2 == guess_digit1) && sentinel==1){
            printf("\nMatch all digits: you win P5000\n");
            sentinel = 0;
        }
        
        if((guess_digit1 != lotto_digit1 && guess_digit1 != lotto_digit2)  && sentinel==1){
            if((guess_digit2 != lotto_digit1 && guess_digit2 != lotto_digit2) && sentinel==1){
                printf("\nSorry, there is no digit match!");
            }else{
                if(sentinel==1)
                    printf("\nMatch 1 digit: you win P2000\n"); 
            }
        }else{
            if(sentinel==1)
                printf("\nMatch 1 digit: you win P2000\n");
            
        }
        
        printf("\nKeep playing? Press 0 to exit\n");
        scanf("%d", &key);
        sentinel = 1;
    }
    
    
    return 0;
}

您发布的代码有一些问题,并且正在纠正其中的每一个,但它太多了,所以我只是从0开始编码。但是如果您有兴趣知道其中的错误,这里有一些对您的代码的澄清:

首先,包含time. h,这样您就不会在time()函数中收到警告或错误:

#include <stdio.h>
#include <stdlib.h>
#include <time.h> // <-- add this

P5000要求存在的问题是,当您将其乘以10时,lottoNum2未初始化。默认情况下,C占用内存中不可避免地包含二进制代码的一部分,导致调用时lottoNum2有一个随机值。要更正此问题,请将lottoNum2初始化为0:

int guess, guess2, lottoNum2=0; <-- this.

从这一点开始,变量lottoNum3lottoNum4被调用,但从未使用过。所以你可以删除它们。

那么关于你的最后一个要求,我注意到的第一件事是你的while语句缺少一个括号:

    while (lottoNum != 0)
    {
        if (guess != lottoNum)
        printf("\nSorry, there is no digit match!");

    } // <----- add this!
}

因为您在上一个while循环中更改了lottoNum的原始值(执行lottoNum/=10;您没有一个地方可以询问第三个要求的数字是多少。所以我建议使用一个临时变量来执行第二个要求:

temp = lottoNum;
while (temp != 0)
{
    ones = temp % 10;
    lottoNum2 = lottoNum2 * 10 + ones;
    temp /= 10;
}

// At this point you still have lottoNum information!

在这一点上,我想要继续使用该代码,您还必须循环您的猜测以查看是否有任何数字匹配,但对于只有2位数字的数字是不必要的。您可以立即计算它。

 类似资料:
  • 题目描述 数字以 0123456789101112131415... 的格式序列化到一个字符串中,求这个字符串的第 index 位。 解题思路 // java public int getDigitAtIndex(int index) { if (index < 0) return -1; int place = 1; // 1 表示个位,2 表示 十位...

  • 我知道Sieve的算法,直到现在我一直在用它来得到高达10亿的素数。 但现在我需要知道一个10位数是素数还是不是素数,而Sieve的算法无法在时间限制内计算出来。 我搜索了很多,找到了费马的素数检验,但它没有成功,因为有些部分我不能理解,而有些部分告诉我,它只是通过一些迭代来判断它是不是可能的素数。 我想知道,在1秒左右的时间内,如何测试一个这么大的数是否为素数?最有效的解决方案/算法是什么? 编

  • 问题内容: 在Java中,有没有一种方法可以确定字符串的第一个字符是否为数字? 一种方法是 并一直执行到9点,但这似乎效率很低。 问题答案: 请注意,这将允许使用 任何 Unicode数字 ,而不仅仅是0-9。您可能更喜欢: 或较慢的正则表达式解决方案: 但是,使用这些方法中的任何一种,必须首先确保该字符串不为空。如果是,而且将引发。没有这个问题。 要使整个条件只占一行,并避免长度检查,可以将正则

  • 问题内容: 我试图在问题历史记录中找到问题的答案,但是当他们浏览了几十个我放弃的匹配答案后,它们又回到了一千多个。所以这是我的问题。 我希望能够找到字符串中正好六个数字的第一个序列。给定字符串“一些文本987654321和一些更多的文本123456,以及其他一些文本再次654321和最后的更多文本”,我想找到与123456序列匹配的正则表达式。 我是regex的新手,对它如何工作的简短解释会很有帮

  • 问题内容: 我只是在学习Java,并且正在尝试让我的程序检索数字的第一个数字- 例如543应该返回5,依此类推。我想转换为字符串,但是我不确定如何将其转换回字符串?谢谢你的帮助。 问题答案: int number = 534; int firstDigit = Integer.parseInt(Integer.toString(number).substring(0, 1));

  • 当日志打印时,我想屏蔽电话号码和身份证的中间。我不想在每个实体类中更改toString方法。有没有办法从一个长字符串中替换电话号码?