商贩卖pig和电话号码组合两类简单问题的求解

问题描述

(1)商贩卖pig
一个商贩养了一批猪,有一天赶着pig去村庄卖,每经过一个村庄就卖掉所有pig的一半又一只。这样他经过了 7 个村子后还剩 2 只pig,请计算并输出他一共养了多少只pig?输出经过每个村子卖出多少只pig?

(2)电话号码对应的字符组合
在电话或者手机上,一个数字比如 2 对应着字母 ABC,7 对应着PQRS。那么数字串 27 所对应的字符的可能组合就有 3*4=12 种(如AP,BR 等)。现在输入一个 3 到 11 位长的电话号码,请打印出这个电话号码所对应的字符的所有可能组合和组合数。


问题分析

注:此处只对两个函数进行分析,且函数标号与标题一致

  • Void useFun1()
    输入:用户需要输入商贩到第几个村庄后(vnum)还剩下多少只pig(pnum);
    输出:到第几个村庄时有多少只pig,卖掉了多少只pig,最后pig总数;
    主要处理过程:利用递归函数int fun1(int vnum,int pnum)计算需要输出 的数据。

  • Void useFun2()
    输入:用户只需要输入电话号码即可(标准输入为3-11)位;
    输出:输入的号码对应九宫格拼音输入共有多少种组合方式,并输出这些组 合方式;
    主要处理过程:利用递归函数
    void fun2(int num[],int pos[],int c,int len)计算组合 方式数目并输出这些组合方式。
    在主方法中调用相关函数满足用户需求即可


流程设计

process


源代码

#include <iostream>
#include <strings.h>
#include <windows.h>

using namespace std;
//存放每个数字对应的字母组合
static char ch[10][5] = {
        {}, //0
        {},  //1
        {'A','B','C'},  //2
        {'D','E','F'},  //3
        {'G','H','I'},  //4
        {'J','K','L'},  //5
        {'M','N','O'},  //6
        {'P','Q','R','S'},  //7
        {'T','U','V'},  //8
        {'W','X','Y','Z'}  //9
    };
//存放每个数字对应的字母的个数
static int total[] = {0,0,3,3,3,3,3,4,3,4};

//实现第一个问题的递归函数
int fun1(int vnum,int pnum);
//负责使用上述函数,保证和用户良好的交互
void useFun1();

//实现第二个问题的递归函数
void fun2(int num[],int pos[],int c,int len); 
//实现第二个问题的循环函数,此函数与上个函数功能相同
void fun2x(int num[],int pos[],int c,int len);
//负责调用上述两个函数之一
void useFun2();



int main()
{
    system("title ps&pnc");//设置控制台标题
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD size_x;
    size_x.X = 61;
    size_x.Y = 200;
    SetConsoleScreenBufferSize(hOut,size_x);//设置字缓冲区大小
    SMALL_RECT rc;
    rc.Left = 0;
    rc.Top = 0;
    rc.Right = 60;
    rc.Bottom = 15;
    SetConsoleWindowInfo(hOut, TRUE, &rc);//设置窗口大小
    do{
        system("cls");
        char re;
        cout << "\t(1) calculation the amount of pigs" << endl;
        cout <<"\t(2) calculation the combination of phone number" << endl;
        cout <<"\t(0) exit" << endl <<endl;
        cout << "\tplease input digit to select function: ";
        cin >> re;
        if(re == '1')
        useFun1();
        else if(re == '2')
        useFun2();
        else if(re == '0')
        break;
        else{
            cout << "please input right digit!" <<endl;
            system("pause");
            continue;
        }
    }while(true);

    return 0;
}

int fun1(int vnum,int pnum,int& f){
    if(vnum == 1){
        cout << "no:" <<f << " have: " << (pnum+1)*2 <<" sale:" << 4 << endl;
        return (pnum+1)*2;
    }
    int re = fun1(--vnum,pnum,f);
    int sum = (re + 1) *2;
    f --;
    cout << "no:" << f << " have: " << sum << " sale:" << sum - re << endl;
    return sum;
}

void useFun1(){
    system("cls");
    int temp,flag;
    cout << "please input village's no and amount(apart in space):" << endl;
    cin >> flag >> temp;
    int sum = fun1(flag,temp,flag);
    cout << "total: " << sum << endl;
    system("pause");

}


void useFun2(){
    system("cls");
    char tel[12];
    cout << "please input telephone number: " << endl;
    cin >> tel;
    int lenc = strlen(tel);
    int numc[lenc];//保存输入的非(‘0’和‘1’)对应的数字
    int posc[lenc];//保存各个数字当前应输出的字母的位置
    int counts = 0;
    //这里获取‘0’和‘1’这样的字符有多少个
    for(int i =0;i< lenc;i++){
        if(tel[i] == '0' || tel[i] == '1')
            counts++;
    }
    //将不是‘0’或者‘1’的数字字符放入numc数组中
    for(int i = 0,j = 0;i < lenc;i++){
            if(tel[i] != '0' && tel[i] != '1'){
            numc[j] = tel[i] - '0';
            posc[j++] = 0;
            }
    }
    lenc = lenc - counts;
    int temp = 1;
    //计算组合数目
    for(int i =0;i < lenc;i++)
    temp *= total[numc[i]];

    cout << "total: " << temp << endl;
    cout <<"possible combination:" <<endl;
    fun2(numc,posc,0,lenc);
    cout << endl;
    system("pause");
}
void fun2(int num[],int pos[],int c,int len){
    if(c == len){
        for(int i =0;i< len;i++){
            cout << ch[num[i]][pos[i]];
        }
        cout << endl;
        return;
    }

    for(pos[c] = 0; pos[c] < total[num[c]];pos[c]++){
        fun2(num,pos,c+1,len);
    }
}

void fun2x(int num[],int pos[],int c,int len){
    while(true){
			for(int i=0; i<len; i++){
				cout << ch[num[i]][pos[i]];
			}
			cout << endl;
			int k=len-1;
			while(k>=0){
				if(pos[k]<total[num[k]]-1){
					pos[k]++;
					break;
				}else{
					pos[k]=0;
					k--;
				}
			}
			if(k<0)
				break;
		}
}



测试

Menu测试
在这里插入图片描述

Function1测试
在这里插入图片描述
在这里插入图片描述

Function2测试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Exit测试
在这里插入图片描述
读者可以自行设计测试样例


更多相关内容请参见

我的博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值