鱼C论坛

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

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

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

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

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

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

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

使用道具 举报

 楼主| 发表于 2018-12-11 20:24:44 | 显示全部楼层
不用指针都做不出来,更别说用指针了...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-11 20:28:05 | 显示全部楼层
求大佬指点!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-11 20:43:49 | 显示全部楼层
要做吐血了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-11 23:36:37 | 显示全部楼层
#include<stdio.h>
int main()
{
        int a[7]={1,2,3,4,5,6,7};
        int b[7]                                                     ;
        int i,j,k;
        int (*r)[7]=&a;
        int (*p)[7]=&b;
        for(i=0;i<7;i++)
        {
                scanf("%d",&b[i]);
        }
        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[7]==b[7])
                                                                                                                {
                                                                                                                        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[j]);
        }
        printf("\n");
        */
          return 0;
}


尽管有报错,但应该对你有帮助
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-13 10:02:20 | 显示全部楼层
#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[i] = (char *)malloc(7 * sizeof(char));
                if (_np[i] == NULL)
                {
                        printf("分配内存失败 _np[i] = (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[count], temp, k);
                                _np[count][k] = '\0';  //补字符串结尾
                                count++;
                                temp++; //右移不断获取k长度的子串
                        }
        }
        *np = _np;
}

int main()
{
        char *win_Number = "1234567"; //中奖号码
        char *Number = (char *)malloc(8 * sizeof(char)); //储存用户号码
        char **np = NULL; //保存获奖子串
        int len[15] = { 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[6] = '\0'; //不是特等奖,与第7位数字无关,去除。

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

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

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

        printf("中了%d等奖\n", 7 - max_len);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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");
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-3 02:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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