鱼C论坛

 找回密码
 立即注册
查看: 2629|回复: 7

彩票兑奖程序问题,题目要求用指针实现,求各位兄弟指点

[复制链接]
发表于 2018-12-11 20:24:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
体育彩票由七位数字组成,第七位数字是特别号码,只有在前面六位数都正确的时候才对第七位数。现在体彩中心给出了一个特等奖号码是1234567,程序要求在屏幕上任输入一个号码判断出中了几等奖。(如果七位数字都相同就是特等奖;前六位相同为一等奖,任连续五位相同为二等奖,任连续四位相同为三等,任连续三位相同为四等,任连续两位相同位五等。(注意:除特等奖外都不考虑第七位)

  不按位对奖:也就是说不管是多少位,只要有连续几位相同都可以。比如说给出的号码是:2312345就中了三等奖(因为1234和前面相同,注意,这里的第七位是5,虽然也相同但是不能算)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-12-11 20:24:44 | 显示全部楼层
不用指针都做不出来,更别说用指针了...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-11 20:28:05 | 显示全部楼层
求大佬指点!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-11 20:43:49 | 显示全部楼层
要做吐血了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-11 23:36:37 | 显示全部楼层
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         int a[7]={1,2,3,4,5,6,7};
  5.         int b[7]                                                     ;
  6.         int i,j,k;
  7.         int (*r)[7]=&a;
  8.         int (*p)[7]=&b;
  9.         for(i=0;i<7;i++)
  10.         {
  11.                 scanf("%d",&b[i]);
  12.         }
  13.         for(j=0;j<6;j++)
  14.         {
  15.                 for(k=0;k<6;k++)
  16.                 {
  17.                         if(*(*p+j)=*(*r+k))
  18.                         {
  19.                                 if(*(*p+j+1)=*(*r+k+1))
  20.                                 {
  21.                                         if(k+1<6||j+i<6);
  22.                                         {
  23.                                                 printf("五等奖\n");
  24.                                                 break;
  25.                                         }
  26.                                         else
  27.                                         {
  28.                                                 if(*(*p+j+2)=*(*r+k+2))
  29.                                                 {
  30.                                                         if(k+2=6||j+2=6);
  31.                                                         {
  32.                                                                 printf("四等奖\n");
  33.                                                                 break;
  34.                                                         }
  35.                                                         else
  36.                                                         {
  37.                                                                 if(*(*p+j+3)=*(*r+k+3))
  38.                                                                 {
  39.                                                                         if(j+3=6||k+3=6)
  40.                                                                         {
  41.                                                                                 printf("三");
  42.                                                                                 break;
  43.                                                                         }
  44.                                                                         else
  45.                                                                         {
  46.                                                                                 if(*(*p+j+4)=*(*r+k+4))
  47.                                                                                 {
  48.                                                                                         if(j+4=6||k+4=6)
  49.                                                                                         {
  50.                                                                                                 printf("二");
  51.                                                                                                 break;
  52.                                                                                         }
  53.                                                                                         else
  54.                                                                                         {
  55.                                                                                                 if(*(*p+j+5)=*(*r+k+5))
  56.                                                                                                 {
  57.                                                                                                         if(j+5=6||k+5=6)
  58.                                                                                                         {
  59.                                                                                                                 printf("一");
  60.                                                                                                                 break;
  61.                                                                                                         }
  62.                                                                                                         else
  63.                                                                                                         {
  64.                                                                                                                 if(a[7]==b[7])
  65.                                                                                                                 {
  66.                                                                                                                         printf("特等奖");
  67.                                                                                                                         break;

  68.                                                                                                                 }
  69.                                                                                                                 else
  70.                                                                                                                 {
  71.                                                                                                                         printf("一");
  72.                                                                                                                 }
  73.                                                                                                         }
  74.                                                                                                 }
  75.                                                                                                 else
  76.                                                                                                 {
  77.                                                                                                         printf("二");
  78.                                                                                                 }
  79.                                                                                         }
  80.                                                                                 }
  81.                                                                                 else
  82.                                                                                 {
  83.                                                                                         printf("三");
  84.                                                                                 }
  85.                                                                         }
  86.                                                                 }
  87.                                                                 else
  88.                                                                 {
  89.                                                                         printf("四");
  90.                                                                 }
  91.                                                         }
  92.                                                 }
  93.                                                 else
  94.                                                 {
  95.                                                         printf("五等奖\n");
  96.                                                 }
  97.                                         }
  98.                                 }
  99.                                 else
  100.                                 {
  101.                                         printf("无奖\n");
  102.                                 }
  103.                         }
  104.                 }
  105.         }
  106.         /*for(j=0;j<7;j++)
  107.         {
  108.                 printf("%d",b[j]);
  109.         }
  110.         printf("\n");
  111.         */
  112.           return 0;
  113. }
复制代码



尽管有报错,但应该对你有帮助
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-13 10:02:20 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. //  123456(最后一位不同)按得奖分析共有 5+4+3+2+1 = 15 种子串
  5. //  1234567 特等奖
  6. //  将所有可能的子串(特等奖除外)存入二维数组 np 中
  7. //  用strstr函数判断用户母串中是否含有子串,若含有,保存所含子串长度
  8. //  所保存的最大子串长度就是对应获奖等级

  9. int get_str(char ***np , char *win_Number)//获取所有子串存入np所指向的内存
  10. {
  11.         char *p = NULL; //返回某个子串
  12.         char *temp = NULL;
  13.         char **_np = NULL; //临时变量储存所有子串 15*7

  14.         p = (char *)malloc(7 * sizeof(char));
  15.         if (p == NULL)
  16.         {
  17.                 printf("分配内存失败 p = (char *)malloc(7 * sizeof(char));\n\n");
  18.                 return -1;
  19.         }
  20.         _np = (char **)malloc(15 * sizeof(char *));
  21.         if (_np == NULL)
  22.         {
  23.                 printf("分配内存失败 _np = (char **)malloc(5 * sizeof(char *));\n\n");
  24.                 return -2;
  25.         }

  26.         for (int i = 0; i < 15; i++)
  27.         {
  28.                 _np[i] = (char *)malloc(7 * sizeof(char));
  29.                 if (_np[i] == NULL)
  30.                 {
  31.                         printf("分配内存失败 _np[i] = (char *)malloc(7 * sizeof(char));\n\n");
  32.                         return -3;
  33.                 }
  34.         }

  35.         int i = 0,count = 0;
  36.         for (int k = 2; k <= 6; k++)  //选定子串位数
  37.         {
  38.                
  39.                         temp = win_Number;
  40.                         for (i = 0; i < 7 - k ; i++) //对该位数下的子串个数(7 - k)进行遍历,复制
  41.                         {
  42.                                 strncpy(_np[count], temp, k);
  43.                                 _np[count][k] = '\0';  //补字符串结尾
  44.                                 count++;
  45.                                 temp++; //右移不断获取k长度的子串
  46.                         }
  47.         }
  48.         *np = _np;
  49. }

  50. int main()
  51. {
  52.         char *win_Number = "1234567"; //中奖号码
  53.         char *Number = (char *)malloc(8 * sizeof(char)); //储存用户号码
  54.         char **np = NULL; //保存获奖子串
  55.         int len[15] = { 0 }; //储存子串长度
  56.         int max_len = 0; //可能存在多个相同子串,取最大长度的那个。
  57.         int i = 0, j = 0;

  58.         printf("输入抽奖号码(7位数): ");
  59.         scanf("%s", Number);

  60.         if (strlen(Number) != 7)  //判断用户输入数字位数是否准确
  61.         {
  62.                 printf("输入号码位数不对");
  63.                 return -1;
  64.         }
  65.        
  66.         if (strcmp(Number, win_Number) == 0)
  67.         {
  68.                 printf("%s 是特等奖\n", Number);
  69.                 return 0;
  70.         }

  71.         Number[6] = '\0'; //不是特等奖,与第7位数字无关,去除。

  72.         int ret = get_str(&np,"123456"); //不是特等奖,与第7位数字无关,传前6位数字。

  73.         for ( i = 0,j = 0; i < 15; i++)
  74.         {
  75.                 if (strstr(Number, np[i]))
  76.                 {
  77.                         len[j] = strlen(np[i]);  //可能存在多个相同子串,取最大长度的那个。
  78.                         j++;
  79.                 }
  80.         }

  81.         for ( i = 0; i < j; i++) //取最大长度的那个。
  82.         {
  83.                 if (max_len < len[i])
  84.                         max_len = len[i];
  85.         }

  86.         printf("中了%d等奖\n", 7 - max_len);
  87.         return 0;
  88. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-23 16:43:32 | 显示全部楼层
刘邦 发表于 2018-12-11 23:36
尽管有报错,但应该对你有帮助

谢谢啦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-23 18:50:38 | 显示全部楼层
本帖最后由 Croper 于 2018-12-23 19:03 编辑
  1. //尽量增加了程序的泛用性,可以自己设定号码的位数和特别号的位数
  2. //思路的核心是计算两个串最大能匹配的子串的长度
  3. //简单而直接的想法是将两个串错位比较,计算最大能匹配的长度,然后右移一位,再次比较,就像这样
  4. //-------abcdefg--        -------abcdefg--                 -abcdefg-------
  5. //-------|--------  ==>   -------||-------  ==>.....==>    -------|-------
  6. //-abfdefg--------        --abcdefg-------                 -------abcdefg-
  7. //使用的编译器为VS 2017,其他编译器可能需要酌情修改
  8. //其他的所有东西都是在犯皮

  9. #include <iostream>

  10. const int CNNUM = 6;         //普通位数
  11. const int CSNUM = 1;         //特等奖位数

  12. int* CutNum(int i,int l)            //分割数字,把每一位填入长度为l的数组中
  13. {
  14.         int *pnum = new int[l];
  15.         l--;
  16.         for (l; l >= 0; l--)
  17.         {
  18.                 pnum[l] = i % 10;
  19.                 i = i / 10;
  20.         }
  21.         return pnum;
  22. }

  23. int GetMaxSameNum(const int* mNum,const int* pNum,int l)  //计算两个数列最大有多少位相同,l为数列长度
  24. {
  25.         const int *p, *q;
  26.         int maxSameNum = 0;
  27.         int n;
  28.         for (int i = 1-l; i < l; i++)  //错位进行比较,p的第n位对应q的第n-1位
  29.         {
  30.                 if (i<0)
  31.                 {
  32.                     p =pNum ;            
  33.                     q =mNum-i;
  34.                 }
  35.                 else
  36.                 {
  37.                         p = pNum + i;
  38.                         q = mNum;
  39.                 }

  40.                 n = 0;              //n记录当前相同位数
  41.                 for (int j = 0; j < l-abs(i); j++)               //错位比较时,只需要比较能对应的l-abs(i)位数
  42.                 {
  43.                         if (*p == *q)
  44.                         {
  45.                                 n++;                        
  46.                         }
  47.                         else
  48.                         {
  49.                                 if (n > maxSameNum) maxSameNum = n;    //当p!=q时,如果当前相同位数大于maxSameNum,记录。并重新将当前相同位数设为0
  50.                                 n = 0;
  51.                         }
  52.                         p++;                 
  53.                         q++;
  54.                 }
  55.                 if (n > maxSameNum) maxSameNum = n;  //当一次匹配循环完成时,同样需要记录当前相同位数,并将其设为0
  56.                 n = 0;
  57.         }

  58.         return maxSameNum;
  59. }

  60. const char* GetPrizeString(int i)            //根据数字给出几等奖,字符串请自己修改(&#10042;ω&#10042;)
  61. {
  62.         switch (i)
  63.         {
  64.         case 0:
  65.                 return "----(0)哇哦,金色传说!-----";
  66.         case 1:
  67.                 return "----(1)传说----";
  68.         case 2:
  69.                 return "----(2)金色史诗----";
  70.         case 3:
  71.                 return "----(3)史诗----";
  72.         case 4:
  73.                 return "----(4)金色稀有----";
  74.         case 5:
  75.                 return "----(5)稀有----";
  76.         }
  77.         return "----抱歉!----";
  78. }

  79. inline void PrintArray(int* a, int l)                  //打印一个数组,便于对比
  80. {
  81.         for (int i = 0; i < l; i++) std::cout << " " << a[i];
  82. }
  83. int main()
  84. {
  85.         int mnum, pnum;
  86.         int *amnum, *apnum;
  87.         int cnsame, cssame;
  88.         int pstrnum;
  89.         std::cout << std::endl << "请输入你的号码:";                                             
  90.         std::cin >> mnum;
  91.         std::cout << std::endl << "请输入中奖号码:";
  92.         std::cin >> pnum;

  93.         amnum = CutNum(mnum,CNNUM+CSNUM);                        //以数组形式记录你的号码
  94.         apnum = CutNum(pnum,CNNUM+CSNUM);                        //以数组形式记录开奖号码
  95.         cnsame = GetMaxSameNum(amnum, apnum, CNNUM);             //计算普通号码最大能匹配的位数   

  96.         amnum += CNNUM;                                        //作为指针右移CNNUM(普通号码个数)个单位,这样对应的就是特等奖号码
  97.         apnum += CNNUM;
  98.         cssame = GetMaxSameNum(amnum, apnum, CSNUM);           //计算特等奖号码最大能匹配的位数        

  99.         pstrnum = CNNUM + CSNUM - cnsame;                       //pstrnum储存奖次,特等奖为0,一等奖为1,依次类推,如果特等价的位数不止一位,也能正常运行,这样就是特一=0 特二=1 一等奖=3..
  100.         if (pstrnum == CSNUM) pstrnum -= cssame;               

  101.         amnum -= CNNUM;                                     //作为指针左移回原位,
  102.         apnum -= CNNUM;
  103.         std::cout << std::endl << "您的号码是:";
  104.         PrintArray(amnum, CNNUM + CSNUM);
  105.         std::cout << std::endl << "中奖号码是:";
  106.         PrintArray(apnum, CNNUM + CSNUM);
  107.         std::cout << std::endl << "开奖结果为:" << std::endl << GetPrizeString(pstrnum) << std::endl << std::endl;

  108.         system("pause");
  109. }

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-14 16:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表