用c语言递归实现字符的排列组合

alicelifei 2006-11-06 11:24:47
为了使电话号码更容易记住,服务商想用字母来拼写适当的单词,使代表某种业务的电话
号码容易记忆。例如,在些地方,提供报时服务的电话号码是637—8687(NERVOUS)。
2:ABC
3:DEF
4:GHI
5:JKL
6:MNO
7:PQR
8:STU
9:VWX
假设您被一家本地电话公司聘用,要编写一个ListMnemonics程序,它能生成由一串数字
表示的电话号码所对应的所有字母组合。例如,如果调用
ListMnemonic s(“723”)
那么将会产生27种字母组合.
PAD PBD PCD RAD RBD RCD SAD SBD SCD
PAE PBE PCE RAE RBE RCE SAE SBE SCE
PAF PBF PCF RAF RBF RCF SAF SBF SCF
...全文
1155 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
alicelifei 2006-11-06
  • 打赏
  • 举报
回复
这是<<程序设计抽象思想>>这本书上第五章课后的第五道编程题
alicelifei 2006-11-06
  • 打赏
  • 举报
回复
不好意思可不可以再说明白一点。我是初学者
mLee79 2006-11-06
  • 打赏
  • 举报
回复
一个3进制的N位数, 每次加1 ...
alicelifei 2006-11-06
  • 打赏
  • 举报
回复
那能幫我看一下我的程序嗎?我的水平也僅限於此了
mLee79 2006-11-06
  • 打赏
  • 举报
回复
不是说过么, 一个3进制的N位数, 每次加1 ...
alicelifei 2006-11-06
  • 打赏
  • 举报
回复
果然是高手,佩服佩服,雖然我運行結果是對的,卻看不懂呢。老兄是否能給該菜鳥解釋一下思想,不勝感激。
mLee79 2006-11-06
  • 打赏
  • 举报
回复
#include <stdio.h>

int main()
{
int len ;
char str [ 1024 ] , *ptr , *pend , *fmt;
while( 1 )
{
printf( "\nInput phone numbers: " );
fflush(stdin);scanf( "%s" , str );
for( ptr = str; *ptr >= '2' && *ptr <= '9' ; ++ptr ) ;
if( *ptr ) continue;
len = ( pend = ptr ) - str;
fmt = len < 10 ? "%-10s" : len < 20 ? "%-20s" : len < 40 ? "%-40s" : "%s\n";
for( ptr = str; ptr != pend; ++ptr )
*ptr = ( *ptr - '2' ) * 3 + 'A';
while( !*pend )
{
printf( fmt , str );
for( ptr = str; ; ++ptr )
{
if( ( ++*ptr - 'A' ) % 3 )
break;
else
*ptr -= 3;
}
}
}
}


alicelifei 2006-11-06
  • 打赏
  • 举报
回复
本蔡鳥只會寫c程序呢。所以那位c++的仁兄對不住了呢。沒看懂。
還有,我帖子上面的例子是寫錯了一點呢。大家領會精神就好了。不好意思。
alicelifei 2006-11-06
  • 打赏
  • 举报
回复
我寫的這個,不能分行顯示,而且用於顯示的數組必須是全局變量。這是我比較困惑的地方
alicelifei 2006-11-06
  • 打赏
  • 举报
回复
#include <stdio.h>
#include "string.h"

void charToChar(char v[]);
void ListMnemonics(char str[][4],int length);

char p[12];

main()
{
int i;
char *v;
clrscr();
printf("Please input not more than 12 telphone numbers:");
gets(v);

charToChar(v);

getch();
}

void charToChar(char v[])
{
int i,j,*num,length;
char str[12][4];
char *number[]=

{"ABC","DEF","GHI","JKL","MNO","PQR","STU","VWX"};

length=strlen(v);

for(i=0;i<length;i++)
{
num[i]=v[i]-48;
}

for(i=0;i<length;i++)
{
for(j=0;j<3;j++)
{
str[i][j]=number[num[i]-2][j];
}
str[i][j]='\0';
}


ListMnemonics(str,length);

}

void ListMnemonics(char str[][4],int length)
{
int i;

if(length==0)
{
printf("%s ",strrev(p));
strrev(p);
}

else
{
for(i=0;i<3;i++)
{
p[length-1]=str[0][i];
ListMnemonics(++str,--length);
--str;
++length;
}

}

}
jixingzhong 2006-11-06
  • 打赏
  • 举报
回复
//----------------------------perm.h
#ifndef PERM_H
#define PERM_H
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

template <typename T>
inline void Swap(T &a,T &b)
{
T temp=a;
a=b;
b=temp;
}

template <typename T>
void Perm( vector< T > list,int k,int m,ostream &os)
{
int i;
if(k==m){
for(i=0;i<=m;++i)
os<<list[i];
os<<endl;
}
else for(i=k;i<=m;++i){
Swap(list[k],list[i]);
Perm(list,k+1,m,os);
Swap(list[k],list[i]);
}
}

#endif

//-----------main.cpp---------------
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include "perm.h"
using namespace std;

int main(int argc, char *argv[])
{
ofstream outfile("print_prem.txt");
vector<int> a;

for(int ix=1;ix<=3;++ix)
a.push_back(ix);
for(int ix=0;ix<a.size();++ix)
cout<<a[ix];

Perm(a,0,a.size()-1,cout);
Perm(a,0,a.size()-1,outfile);

system("PAUSE");
return 0;
}
mLee79 2006-11-06
  • 打赏
  • 举报
回复
貌似你的对应关系跟你的例子不符, 应该是
7 : PQRS
8 : TUV
9 : WXYZ

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧