|
发表于 2018-12-23 18:50:38
|
显示全部楼层
本帖最后由 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];
- l--;
- for (l; l >= 0; l--)
- {
- pnum[l] = 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[i];
- }
- 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");
- }
复制代码 |
|