本帖最后由 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");
}
|