问题:编写一个c程序,允许用户随心所欲地玩彩票。该程序随机生成一个两位数的彩票,提示用户输入一个两位数的号码,并根据以下规则确定用户是否中奖:
所需知识:生成随机数、比较数字、使用布尔运算符、选择和循环结构。
我被第三个要求困住了,你能帮忙吗?
这是我目前的代码。。。
#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!");
}
将其分解为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;
}
我是这样解决的:
#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.
从这一点开始,变量lottoNum3
和lottoNum4
被调用,但从未使用过。所以你可以删除它们。
那么关于你的最后一个要求,我注意到的第一件事是你的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方法。有没有办法从一个长字符串中替换电话号码?