彩票兑奖程序问题,题目要求用指针实现,求各位兄弟指点
体育彩票由七位数字组成,第七位数字是特别号码,只有在前面六位数都正确的时候才对第七位数。现在体彩中心给出了一个特等奖号码是1234567,程序要求在屏幕上任输入一个号码判断出中了几等奖。(如果七位数字都相同就是特等奖;前六位相同为一等奖,任连续五位相同为二等奖,任连续四位相同为三等,任连续三位相同为四等,任连续两位相同位五等。(注意:除特等奖外都不考虑第七位)不按位对奖:也就是说不管是多少位,只要有连续几位相同都可以。比如说给出的号码是:2312345就中了三等奖(因为1234和前面相同,注意,这里的第七位是5,虽然也相同但是不能算)
不用指针都做不出来,更别说用指针了... 求大佬指点!
要做吐血了 #include<stdio.h>
int main()
{
int a={1,2,3,4,5,6,7};
int b ;
int i,j,k;
int (*r)=&a;
int (*p)=&b;
for(i=0;i<7;i++)
{
scanf("%d",&b);
}
for(j=0;j<6;j++)
{
for(k=0;k<6;k++)
{
if(*(*p+j)=*(*r+k))
{
if(*(*p+j+1)=*(*r+k+1))
{
if(k+1<6||j+i<6);
{
printf("五等奖\n");
break;
}
else
{
if(*(*p+j+2)=*(*r+k+2))
{
if(k+2=6||j+2=6);
{
printf("四等奖\n");
break;
}
else
{
if(*(*p+j+3)=*(*r+k+3))
{
if(j+3=6||k+3=6)
{
printf("三");
break;
}
else
{
if(*(*p+j+4)=*(*r+k+4))
{
if(j+4=6||k+4=6)
{
printf("二");
break;
}
else
{
if(*(*p+j+5)=*(*r+k+5))
{
if(j+5=6||k+5=6)
{
printf("一");
break;
}
else
{
if(a==b)
{
printf("特等奖");
break;
}
else
{
printf("一");
}
}
}
else
{
printf("二");
}
}
}
else
{
printf("三");
}
}
}
else
{
printf("四");
}
}
}
else
{
printf("五等奖\n");
}
}
}
else
{
printf("无奖\n");
}
}
}
}
/*for(j=0;j<7;j++)
{
printf("%d",b);
}
printf("\n");
*/
return 0;
}
尽管有报错,但应该对你有帮助 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
//123456(最后一位不同)按得奖分析共有 5+4+3+2+1 = 15 种子串
//1234567 特等奖
//将所有可能的子串(特等奖除外)存入二维数组 np 中
//用strstr函数判断用户母串中是否含有子串,若含有,保存所含子串长度
//所保存的最大子串长度就是对应获奖等级
int get_str(char ***np , char *win_Number)//获取所有子串存入np所指向的内存
{
char *p = NULL; //返回某个子串
char *temp = NULL;
char **_np = NULL; //临时变量储存所有子串 15*7
p = (char *)malloc(7 * sizeof(char));
if (p == NULL)
{
printf("分配内存失败 p = (char *)malloc(7 * sizeof(char));\n\n");
return -1;
}
_np = (char **)malloc(15 * sizeof(char *));
if (_np == NULL)
{
printf("分配内存失败 _np = (char **)malloc(5 * sizeof(char *));\n\n");
return -2;
}
for (int i = 0; i < 15; i++)
{
_np = (char *)malloc(7 * sizeof(char));
if (_np == NULL)
{
printf("分配内存失败 _np = (char *)malloc(7 * sizeof(char));\n\n");
return -3;
}
}
int i = 0,count = 0;
for (int k = 2; k <= 6; k++)//选定子串位数
{
temp = win_Number;
for (i = 0; i < 7 - k ; i++) //对该位数下的子串个数(7 - k)进行遍历,复制
{
strncpy(_np, temp, k);
_np = '\0';//补字符串结尾
count++;
temp++; //右移不断获取k长度的子串
}
}
*np = _np;
}
int main()
{
char *win_Number = "1234567"; //中奖号码
char *Number = (char *)malloc(8 * sizeof(char)); //储存用户号码
char **np = NULL; //保存获奖子串
int len = { 0 }; //储存子串长度
int max_len = 0; //可能存在多个相同子串,取最大长度的那个。
int i = 0, j = 0;
printf("输入抽奖号码(7位数): ");
scanf("%s", Number);
if (strlen(Number) != 7)//判断用户输入数字位数是否准确
{
printf("输入号码位数不对");
return -1;
}
if (strcmp(Number, win_Number) == 0)
{
printf("%s 是特等奖\n", Number);
return 0;
}
Number = '\0'; //不是特等奖,与第7位数字无关,去除。
int ret = get_str(&np,"123456"); //不是特等奖,与第7位数字无关,传前6位数字。
for ( i = 0,j = 0; i < 15; i++)
{
if (strstr(Number, np))
{
len = strlen(np);//可能存在多个相同子串,取最大长度的那个。
j++;
}
}
for ( i = 0; i < j; i++) //取最大长度的那个。
{
if (max_len < len)
max_len = len;
}
printf("中了%d等奖\n", 7 - max_len);
return 0;
} 刘邦 发表于 2018-12-11 23:36
尽管有报错,但应该对你有帮助
谢谢啦 本帖最后由 Croper 于 2018-12-23 19:03 编辑
//尽量增加了程序的泛用性,可以自己设定号码的位数和特别号的位数
//思路的核心是计算两个串最大能匹配的子串的长度
//简单而直接的想法是将两个串错位比较,计算最大能匹配的长度,然后右移一位,再次比较,就像这样
//-------abcdefg-- -------abcdefg-- -abcdefg-------
//-------|--------==> -------||-------==>.....==> -------|-------
//-abfdefg-------- --abcdefg------- -------abcdefg-
//使用的编译器为VS 2017,其他编译器可能需要酌情修改
//其他的所有东西都是在犯皮
#include <iostream>
const int CNNUM = 6; //普通位数
const int CSNUM = 1; //特等奖位数
int* CutNum(int i,int l) //分割数字,把每一位填入长度为l的数组中
{
int *pnum = new int;
l--;
for (l; l >= 0; l--)
{
pnum = i % 10;
i = i / 10;
}
return pnum;
}
int GetMaxSameNum(const int* mNum,const int* pNum,int l)//计算两个数列最大有多少位相同,l为数列长度
{
const int *p, *q;
int maxSameNum = 0;
int n;
for (int i = 1-l; i < l; i++)//错位进行比较,p的第n位对应q的第n-1位
{
if (i<0)
{
p =pNum ;
q =mNum-i;
}
else
{
p = pNum + i;
q = mNum;
}
n = 0; //n记录当前相同位数
for (int j = 0; j < l-abs(i); j++) //错位比较时,只需要比较能对应的l-abs(i)位数
{
if (*p == *q)
{
n++;
}
else
{
if (n > maxSameNum) maxSameNum = n; //当p!=q时,如果当前相同位数大于maxSameNum,记录。并重新将当前相同位数设为0
n = 0;
}
p++;
q++;
}
if (n > maxSameNum) maxSameNum = n;//当一次匹配循环完成时,同样需要记录当前相同位数,并将其设为0
n = 0;
}
return maxSameNum;
}
const char* GetPrizeString(int i) //根据数字给出几等奖,字符串请自己修改(✺ω✺)
{
switch (i)
{
case 0:
return "----(0)哇哦,金色传说!-----";
case 1:
return "----(1)传说----";
case 2:
return "----(2)金色史诗----";
case 3:
return "----(3)史诗----";
case 4:
return "----(4)金色稀有----";
case 5:
return "----(5)稀有----";
}
return "----抱歉!----";
}
inline void PrintArray(int* a, int l) //打印一个数组,便于对比
{
for (int i = 0; i < l; i++) std::cout << " " << a;
}
int main()
{
int mnum, pnum;
int *amnum, *apnum;
int cnsame, cssame;
int pstrnum;
std::cout << std::endl << "请输入你的号码:";
std::cin >> mnum;
std::cout << std::endl << "请输入中奖号码:";
std::cin >> pnum;
amnum = CutNum(mnum,CNNUM+CSNUM); //以数组形式记录你的号码
apnum = CutNum(pnum,CNNUM+CSNUM); //以数组形式记录开奖号码
cnsame = GetMaxSameNum(amnum, apnum, CNNUM); //计算普通号码最大能匹配的位数
amnum += CNNUM; //作为指针右移CNNUM(普通号码个数)个单位,这样对应的就是特等奖号码
apnum += CNNUM;
cssame = GetMaxSameNum(amnum, apnum, CSNUM); //计算特等奖号码最大能匹配的位数
pstrnum = CNNUM + CSNUM - cnsame; //pstrnum储存奖次,特等奖为0,一等奖为1,依次类推,如果特等价的位数不止一位,也能正常运行,这样就是特一=0 特二=1 一等奖=3..
if (pstrnum == CSNUM) pstrnum -= cssame;
amnum -= CNNUM; //作为指针左移回原位,
apnum -= CNNUM;
std::cout << std::endl << "您的号码是:";
PrintArray(amnum, CNNUM + CSNUM);
std::cout << std::endl << "中奖号码是:";
PrintArray(apnum, CNNUM + CSNUM);
std::cout << std::endl << "开奖结果为:" << std::endl << GetPrizeString(pstrnum) << std::endl << std::endl;
system("pause");
}
页:
[1]