| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1708 人关注过本帖, 1 人收藏
标题:微创笔试编程题,高手指点下
只看楼主 加入收藏
wlhdhn
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2009-11-18
结帖率:50%
收藏(1)
 问题点数:0 回复次数:11 
微创笔试编程题,高手指点下
在电话机键盘上,可以发现26个字母的分布在2到9这8个数字键上,某人的电话号码是65967427,观察单词“Olympics”;可以发现:字母o位于数字键5上,。。。字母s对应数字键7,此时我们说olmpics是65967427对应的一个字母组合,65967427还可以对应其他很多种字母组合,例如mjwmpgap也是其中之一,以C语言编写函数,该函数的输入为一个电话号码(允许输入为3位到11位的十进制数),在屏幕上输出该数字对应的所有字母组合,并返回组合的总数,如果数字中包含1或0,由于没有与之对应的字母,则直接返回0.
请高手帮忙解答下,我想着用嵌套循环,可是若输入十一位要十一层嵌套啊,应该有更好的方法,大家相互交流下
搜索更多相关主题的帖子: 微创 笔试 
2010-06-25 14:01
wlhdhn
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2009-11-18
收藏
得分:0 
我自己尝试了输入三个数字的情况,已经正确运行。
#include<stdio.h>
#include<string.h>
void main()
{int i,j,k,m=0;int n0,n1,n2;
char pho[10][5]={{'0'},{'0'},"abc","def","ghi","jkl","mno","pqrs",{'t','u','v'},{'w','x','y','z'}};
char num[11],word[11];
printf("put your number please:\n");
gets(num);
n0=num[0]-48;
n1=num[1]-48;n2=num[2]-48;
printf("%d %d %d\n",n0,n1,n2);
puts(pho[n0]);puts(pho[n1]);puts(pho[n2]);
printf("\n%d\n",strlen(pho[n2]));
for(i=0;i<(int)strlen(pho[n0]);i++)
{word[0]=pho[n0][i];
for(j=0;j<(int)strlen(pho[n1]);j++)
{word[1]=pho[n1][j];
for(k=0;k<(int)strlen(pho[n2]);k++)
{word[2]=pho[n2][k];word[3]='\0';
puts(word);putchar('\n');
m++;
}
}
}
printf("\n the total m=%d\n",m);
}
输入三位数的还可以一个一个的赋值,做嵌套循环,如果输入11个数,一一嵌套的话,那就太庞大了
2010-06-25 14:11
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
要考虑到运算效率,也要考虑到字母的重复,因为 11 位数字最少应该有 33 个字母的组合.

2010-06-25 14:16
wlhdhn
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2009-11-18
收藏
得分:0 
是啊,应该考虑运算效率的,若按每个字有3种选择字母,则11个数是3的11次方
2010-06-25 15:20
linjx0123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:279
专家分:1362
注 册:2006-4-7
收藏
得分:0 
利用递归做,主要代码如下:
void allComposition(int begin, int end){
//begin是开始位数,end是结束位数,假如输入11位的num(num为数组),那么begin=0,end=10;假设11位数字为{4,5,0,6,5,7,3,4,6,4,6}
        if(begin==end){
//如果开始位置跟结束位置相等,则输出结果res,res是一个字符数组,大小为num数组的位数。
            for(int i=0;i<ch[num[begin]].length;i++){
//num[begin]是第begin位的数字,ch[][]是一个2维char数组,每一行存的是对应下标的字符.比如ch[2][]={'a','b','c'};
                res[begin]=ch[num[begin]][i];//res字符数组的最后一个字符的值。
                printArray();//打印出res中的字符。也就是数字所代码的字母组合
                count++;//记录次数
            }
            return;
        }
        for(int i=0;i<ch[num[begin]].length;i++){
            res[begin]=ch[num[begin]][i];
            allComposition(begin+1,end);
        }
    }

45065734646对应的结果次数为:78732。由于我是用java程序写的,完整代码就不贴了
2010-06-25 15:46
linjx0123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:279
专家分:1362
注 册:2006-4-7
收藏
得分:0 
其实代码是相通的,还是贴下java代码吧,供楼主参考下。(我的代码没考虑键盘输入的,因为java的键盘输入比较麻烦)
程序代码:
public class Perm {
    static int count=0;
    static char[][] ch=new char[10][];
    static int num[];
    static int max=11;
    static char[] res = new char[max];
   
    static{
        ch[0]=new char[]{'0'};
        ch[1]=new char[]{'0'};
        ch[2]=new char[]{'a','b','c'};
        ch[3]=new char[]{'d','e','f'};
        ch[4]=new char[]{'g','h','i'};
        ch[5]=new char[]{'j','k','l'};
        ch[6]=new char[]{'m','n','o'};
        ch[7]=new char[]{'p','q','r','s'};
        ch[8]=new char[]{'t','u','v'};
        ch[9]=new char[]{'w','x','y','z'};
    }
   
    public static void printArray(){
        for(int i=0;i<res.length;i++){
            System.out.print(res[i]);
        }
        System.out.println();
    }
   
    public static void allComposition(int begin, int end){
        if(begin==end){
            for(int i=0;i<ch[num[begin]].length;i++){
                res[begin]=ch[num[begin]][i];
                printArray();
                count++;
            }
            return;
        }
        for(int i=0;i<ch[num[begin]].length;i++){
            res[begin]=ch[num[begin]][i];
            allComposition(begin+1,end);
        }
    }
   
    public static void main(String[] args) {
        num=new int[]{4,5,0,6,5,7,3,4,6,4,6};
        allComposition(0,10);
        System.out.println("count:"+count);
    }
}

2010-06-25 15:50
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:606
专家分:2499
注 册:2009-4-8
收藏
得分:0 
程序代码:
#include<iostream>
#include<string>
using namespace std;
char pho[11][5] =
{
    "0", "1",
    "abc","def","ghi","jkl","mno",
    "pqrs",
    "tuv",
    "wxyz",
    "{"
};


int main()
{
    string str;
    cin >> str;
    int i = 0;
    int j = 0;
    int arr[12];
    while(str[i] != '\0')
    {
        char c = str[i++];
        if (c > '1')
        {
            str[j] = pho[c -'0'][0];
            arr[j] = c - '0';
            ++j;
        }
    }
    str[j] = '\0';
    i = 0;
    while (str[i] != '\0')
    {
        cout << str << endl;
        i = 0;

        while (str[i] != '\0' && ++str[i] == pho[*(arr+i)+1][0])
        {
            str[i] = pho[*(arr+i)][0];
            ++i;
        }
    }
    return 0;
}

迭代的是人,递归的是神。
2010-06-25 22:47
wlhdhn
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2009-11-18
收藏
得分:0 
谢谢楼上这么耐心的回答!!
2010-06-26 19:27
wlhdhn
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2009-11-18
收藏
得分:0 
下面是我根据楼上给出的Java写的C程序,已经调试过了,与大家分享下,这个重点就是函数递归调用。
#include<stdio.h>
#include<string.h>
int count=0;
char num[11],res[11];
char pho[10][5]={{'0'},{'0'},"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
void allcomposition(int begin,int end)
{int i,j,k;
if(begin==end)
{k=num[begin]-48;
for(i=0;i<(int)strlen(pho[k]);i++)
{res[begin]=pho[k][i];
puts(res);
count++;
if(count%4==0)
printf("\n");
}
}
for(j=0;j<(int)strlen(pho[num[begin]-48]);j++)
{res[begin]=pho[num[begin]-48][j];
allcomposition(begin+1,end);
}
}
void main()
{int begin,end;
printf("input your number please:\n");
gets(num);
begin=0;end=strlen(num)-1;
allcomposition(begin,end);
printf("\nthere are totally %5d\n",count);
}
2010-06-27 18:28
zghnxzdcx
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:550
专家分:1176
注 册:2010-4-6
收藏
得分:0 
可以考虑一下switch case

你永远不可能战胜一个纯傻子,因为他会把你的智商拉到和他同一个水平,然后用他的丰富经验打败你。
2010-06-28 09:32
快速回复:微创笔试编程题,高手指点下
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021225 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved