求高手帮忙解一道题


输入1-9中的任意7个数字,如(1234567),其中1可表示为a或b或c,2可表示为d或e或f,3可表示为g或h或i,4可表示为j或K,5可表示为l或m或n,6可表示为o或p或q,7可表示为r或s或t,8可表示为u或v,9可表示为w或x或y或z
如何输出那个7位的数所表示的所有字母组合。如adgjloruw是一种可能。
求高手帮忙,谢谢!

26 个解决方案

#1


你说输入的是7位,adgjloruw这个结果是不可能的吧!你写错了吧!
还有数字可以重复吗?比如1234566

#2


//写得很繁琐,郁闷,结果也很多啊。谁给个简单的

import java.util.Scanner;
import java.io.*;
public class Test { 
    
     public static void main(String args[]) throws Exception{ 
      File f = new File("result.txt");
      FileWriter fw = new FileWriter(f);
      BufferedWriter bw = new BufferedWriter(fw);
Scanner reader = new Scanner(System.in);
     String s = reader.next();
String[][] str = new String[7][];
      int[] num = new int[7];
     
      for(int i=0;i<7;i++){
      num[i] = Integer.parseInt(""+s.charAt(i));
      if(num[i]>=1 && num[i]<=9){
      str[i]= getChar(num[i]);
      }else{
      System.out.println("Error input");
      System.exit(0);
      }
      }
     
     long count = 0;
String output = "";
      for(int n1=0;n1<str[0].length;n1++)
      for(int n2=0;n2<str[1].length;n2++)
      for(int n3=0;n3<str[2].length;n3++)
      for(int n4=0;n4<str[3].length;n4++)
      for(int n5=0;n5<str[4].length;n5++)
      for(int n6=0;n6<str[5].length;n6++)
      for(int n7=0;n7<str[6].length;n7++){
      count++;
      output += str[0][n1]+str[1][n2]+str[2][n3]
      +str[3][n4]+str[4][n5]+str[5][n6]+str[6][n7]+" ";
     
     
  }
  bw.write(output);
  bw.close();
  System.out.println(s+": "+count); 
     }  

public static String[] getChar(int i){
String[] str = null;
switch(i){
case 1:
String[] num1 = {"a","b","c"};
str = num1;
break;
case 2:
String[] num2 = {"d","e","f"};
str = num2;
break;
case 3:
String[] num3 = {"g","h","i"};
str = num3;
break;
case 4:
String[] num4 = {"j","k"};
str = num4;
break;
case 5:
String[] num5 = {"l","m","n"};
str = num5;
break;
case 6:
String[] num6 = {"o","p","q"};
str = num6;
break;
case 7:
String[] num7 = {"r","s","t"};
str = num7;
break;
case 8:
String[] num8 = {"u","v"};
str = num8;
break;
case 9:
String[] num9 = {"w","x","y","z"};
str = num9;
break;
}

return str;
}



#3


晕死```
   这样做出来的项目有几台机器可以承受呀`````
              吓人

#4


我写了一个


/****************************
 * 实现自定义的整数加法
 */

import java.util.Arrays;

public class MyInteger {
private int[] num;
private int[] limit;

public MyInteger(int[] num, int[] limit) {
super();
this.num = num;
this.limit = limit;
}

public int[] getNum() {
return num;
}

public void setNum(int[] num) {
this.num = num;
}

public int[] getLimit() {
return limit;
}

public void setLimit(int[] limit) {
this.limit = limit;
}


public int[] addOne(){
int n = num.length-1;
int a = 1;
while(a != 0 && n>=0){
num[n]+=a;
if(num[n]>=limit[n]){
num[n] = 0;
a = 1;
}
else{
a = 0;
}
n--;
}
return getNum();
}
}

/**************************
 * 主要类
 */

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Paixu {

public static void getNum(int[] num) {
List<Integer> nums = new ArrayList<Integer>(9);
for (int i = 1; i < 10; i++) {
nums.add(i);
}
Collections.shuffle(nums);
for (int i = 0; i < num.length; i++) {
num[i] = nums.get(i);
}
}

public static void main(String args[]) {
int N = 2;
int[] num = new int[N];
int[] aNum = new int[N];
int[] limit = new int[N];
char[][] a = { { 'a', 'b', 'c' }, { 'd', 'e', 'f' }, { 'g', 'h', 'i' },
{ 'j', 'k' }, { 'l', 'm', 'n' }, { 'o', 'p', 'q' },
{ 'r', 's', 't' }, { 'u', 'v' }, { 'w', 'x', 'y', 'z' } };

getNum(num); // 从1~9中随机取N个数字

for (int i = 0; i < aNum.length; i++) {
aNum[i] = 0;
limit[i] = a[num[i] - 1].length;
}

System.out.print("找到的" + N + "个数字分别是:");
for (int i = 0; i < num.length; i++) {
System.out.print(num[i] + " ");
}
System.out.println();

MyInteger mi = new MyInteger(aNum, limit);

int k = 1;
for (int i : limit) {
k *= i;
}
while (k > 0) {
int[] result = mi.addOne();

for (int i = 0; i < result.length; i++) {
System.out.print(a[num[i] - 1][result[i]]);
}
System.out.println();
k--;
}

}
}


由于7个实在结果太多,我这里就取2个数字,所以N = 2; 如果要修改,可以改掉

运行结果:
找到的2个数字分别是:9 7 
ws
wt
xr
xs
xt
yr
ys
yt
zr
zs
zt
wr

一共12种排序,一个不少。

如果N=7, 我随机取得是9 6 7 3 8 1 2 这七个数字,运行时间是226毫秒。

#5


楼上的当N改为10或以上的时候,怎么程序没法运行啊?

#6


引用 5 楼 natulist 的回复:
楼上的当N改为10或以上的时候,怎么程序没法运行啊?

巨强的排列组合,应该有简单一点的办法,琢磨一下。

#7


import java.io.*;
public class RandomNumString 
{
//输入1-9中的任意7个数字,如(1234567),其中1可表示为a或b或c,2可表示为d或e或f,3可表示为g或h或i,4可表示为j或K,
//5可表示为l或m或n,6可表示为o或p或q,7可表示为r或s或t,8可表示为u或v,9可表示为w或x或y或z 
//如何输出那个7位的数所表示的所有字母组合。如adgjloruw是一种可能。
public static void main(String[] args)
{
try
{
System.out.println("请输入一个七位数,其中不包括0");
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
String s=br.readLine();
for(int j=0;j<numString(s.charAt(0)).length();j++)
for(int k=0;k<numString(s.charAt(1)).length();k++)
for(int l=0;l<numString(s.charAt(2)).length();l++)
for(int m=0;m<numString(s.charAt(3)).length();m++)
for(int n=0;n<numString(s.charAt(4)).length();n++)
for(int o=0;o<numString(s.charAt(5)).length();o++)
for(int p=0;p<numString(s.charAt(6)).length();p++)
{
String str1=""+numString(s.charAt(0)).charAt(j)+numString(s.charAt(1)).charAt(k)+numString(s.charAt(2)).charAt(l)+numString(s.charAt(3)).charAt(m)+numString(s.charAt(4)).charAt(n)+numString(s.charAt(5)).charAt(o)+numString(s.charAt(6)).charAt(p);
System.out.print(str1);
System.out.println();
}
}
catch(IOException e){}
}
static String numString(char x)
{
String str="a";
if(x=='1')str="abc";
if(x=='2')str="def";
if(x=='3')str="ghi";
if(x=='4')str="jk";
if(x=='5')str="lmn";
if(x=='6')str="opq";
if(x=='7')str="rst";
if(x=='8')str="uv";
if(x=='9')str="wxyz";
return str;
}
}

#8


感谢楼主,我初学者,顺便学习了StringBuffer;
import java.io.*;
public class RandomNumString 
{
//输入1-9中的任意7个数字,如(1234567),其中1可表示为a或b或c,2可表示为d或e或f,3可表示为g或h或i,4可表示为j或K,
//5可表示为l或m或n,6可表示为o或p或q,7可表示为r或s或t,8可表示为u或v,9可表示为w或x或y或z 
//如何输出那个7位的数所表示的所有字母组合。如adgjloruw是一种可能。
public static void main(String[] args)
{
try
{
System.out.println("请输入一个七位数,其中不包括0");
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
String s=br.readLine();
for(int j=0;j<numString(s.charAt(0)).length();j++)
for(int k=0;k<numString(s.charAt(1)).length();k++)
for(int l=0;l<numString(s.charAt(2)).length();l++)
for(int m=0;m<numString(s.charAt(3)).length();m++)
for(int n=0;n<numString(s.charAt(4)).length();n++)
for(int o=0;o<numString(s.charAt(5)).length();o++)
for(int p=0;p<numString(s.charAt(6)).length();p++)
{
//String str1=""+numString(s.charAt(0)).charAt(j)+numString(s.charAt(1)).charAt(k)+numString(s.charAt(2)).charAt(l)+numString(s.charAt(3)).charAt(m)+numString(s.charAt(4)).charAt(n)+numString(s.charAt(5)).charAt(o)+numString(s.charAt(6)).charAt(p);
//System.out.print(str1);
//System.out.println();
char s1=numString(s.charAt(0)).charAt(j);
char s2=numString(s.charAt(1)).charAt(k);
char s3=numString(s.charAt(2)).charAt(l);
char s4=numString(s.charAt(3)).charAt(m);
char s5=numString(s.charAt(4)).charAt(n);
char s6=numString(s.charAt(5)).charAt(o);
char s7=numString(s.charAt(6)).charAt(p);
StringBuffer sb=new StringBuffer().append(s1).append(s2).append(s3).append(s4).append(s5).append(s6).append(s7);
System.out.print(sb);
System.out.println();
}
}
catch(IOException e){}
}
static String numString(char x)
{
String str="a";
if(x=='1')str="abc";
if(x=='2')str="def";
if(x=='3')str="ghi";
if(x=='4')str="jk";
if(x=='5')str="lmn";
if(x=='6')str="opq";
if(x=='7')str="rst";
if(x=='8')str="uv";
if(x=='9')str="wxyz";
return str;
}
}

#9



import java.io.*;
public class RandomNumString 
{
    //输入1-9中的任意7个数字,如(1234567),其中1可表示为a或b或c,2可表示为d或e或f,3可表示为g或h或i,4可表示为j或K,
    //5可表示为l或m或n,6可表示为o或p或q,7可表示为r或s或t,8可表示为u或v,9可表示为w或x或y或z 
    //如何输出那个7位的数所表示的所有字母组合。如adgjloruw是一种可能。
    public static void main(String[] args)
    {
        try
        {
            System.out.println("请输入一个七位数,其中不包括0");
            InputStreamReader isr=new InputStreamReader(System.in);
            BufferedReader br=new BufferedReader(isr);
            String s=br.readLine();
                for(int j=0;j<numString(s.charAt(0)).length();j++)
                    for(int k=0;k<numString(s.charAt(1)).length();k++)
                        for(int l=0;l<numString(s.charAt(2)).length();l++)
                            for(int m=0;m<numString(s.charAt(3)).length();m++)
                                for(int n=0;n<numString(s.charAt(4)).length();n++)
                                    for(int o=0;o<numString(s.charAt(5)).length();o++)
                                        for(int p=0;p<numString(s.charAt(6)).length();p++)
                                            {
                                         String sb1 = numString(s.charAt(0)).charAt(j)+"";
                                         String sb2 = numString(s.charAt(1)).charAt(k)+"";
                                         String sb3 = numString(s.charAt(2)).charAt(l)+"";
                                         String sb4 = numString(s.charAt(3)).charAt(m)+"";
                                         String sb5 = ""+numString(s.charAt(4)).charAt(n)+"";
                                         String sb6 = numString(s.charAt(5)).charAt(o)+"";
                                         String sb7 = numString(s.charAt(6)).charAt(p)+"";
                                                System.out.print(sb1+sb2+sb3+sb4+sb5+sb6+sb7);
                                                System.out.println();
                                            }
        }
        catch(IOException e){}
    }
    static String numString(char x)
    {
        String str="a";
        if(x=='1')str="abc";
        if(x=='2')str="def";
        if(x=='3')str="ghi";
        if(x=='4')str="jk";
        if(x=='5')str="lmn";
        if(x=='6')str="opq";
        if(x=='7')str="rst";
        if(x=='8')str="uv";
        if(x=='9')str="wxyz";
        return str;
    }
}

#10


用了7个for的程序肯定不可取。至少应该象4楼那样用数组表示。

#11


回答5楼:
楼上的当N改为10或以上的时候,怎么程序没法运行啊?

因为我就设定了数组a[9][]阿,也就是说从1~9个数字中取若干个数字

你N=10,。,。。。当然出错了,我没有写输入验证。

这个方法我觉得是比较简单的实现了,比7重循环好一些

#12


引用 10 楼 jayflee 的回复:
用了7个for的程序肯定不可取。至少应该象4楼那样用数组表示。

我开始也想用数组,可是由于我是初学,实在是没有想到怎么用数组输出每一种可能,只好用最笨的方法.我再看下4楼的.

#13


哦,我有点明白5楼的意思,忘了说明一点,我是默认取得数字是不能重复的,所以1~9数字不能取超过9个数字,如果可以重复的话,需要修改
getNum(int[] num)这个方法,

不好意思,题目要求我理解成不能重复的了,楼主请说的更清楚一些。

7重循环是最简单的实现方法,并不是说效率低,因为我的方法效率说不定还比不上用循环,主要是如果用循环来做的话,如果我要取的数字数目不定,就不好实现了

#14


引用 11 楼 zrzlj 的回复:
回答5楼: 
楼上的当N改为10或以上的时候,怎么程序没法运行啊? 

因为我就设定了数组a[9][]阿,也就是说从1~9个数字中取若干个数字 

你N=10,。,。。。当然出错了,我没有写输入验证。 

这个方法我觉得是比较简单的实现了,比7重循环好一些

求教一下:你的代码放到eclipse中提示第一个类"错误设置了构造"请问可以解决一下吗?我才学java想把这个简单的方法学会搞明白,谢谢.

#15


引用 13 楼 zrzlj 的回复:
哦,我有点明白5楼的意思,忘了说明一点,我是默认取得数字是不能重复的,所以1~9数字不能取超过9个数字,如果可以重复的话,需要修改 
getNum(int[] num)这个方法, 

不好意思,题目要求我理解成不能重复的了,楼主请说的更清楚一些。 

7重循环是最简单的实现方法,并不是说效率低,因为我的方法效率说不定还比不上用循环,主要是如果用循环来做的话,如果我要取的数字数目不定,就不好实现了

恩,我想了老久,也没有想到怎么能把需要的数目由输入给定,没想到...

#16


啊?我也不了解了,我是从eclipse中复制过来的。。。。

#17


引用 16 楼 zrzlj 的回复:
啊?我也不了解了,我是从eclipse中复制过来的。。。。 

哇,不会吧,你的里面没问题,我的里面它给我一大片红色波浪线.

#18


试下我的吧,
我的你输入七个数,输入1到9,重复也行。
如果含有不是1到9就提示错误退出。
少于7个就数组下标越界了,没去判断了。
要控制长度也行啊,加个判断string的length就行了。
结果保存在文本里。
速度也不慢啊,
1000多个结果2秒多,跟4楼差不了多少,不过还是向4楼学习。

#19


吃完饭我又修改了一下,把 getNum(int[] num)修改成:


public static void getNum(int[] num) {
        for(int i=0; i<num.length; i++){
         num[i] = new Random().nextInt(9)+1;    //随机取N个1~9之间的任意数字,可以重复
        }
    }


就行了,其实要可以重复的话,更简单一些。

当N=10的时候输出太多,控制台放不下,可以自己修改一下,输出到文件中去。



回答17楼,我真的不知道为什么,我刚刚在实验室也是从帖子上把我的代码复制下来的,没有任何问题啊。

#20


递归全排列各位
然后全排列出来的每一个组合对其可用的数值进行穷举

#21


递归算法。


public class NumberConvert {

static char[][] converter = { { 'a', 'b', 'c' }, { 'd', 'e', 'f' }, { 'g', 'h', 'i' },
            { 'j', 'k' }, { 'l', 'm', 'n' }, { 'o', 'p', 'q' },
            { 'r', 's', 't' }, { 'u', 'v' }, { 'w', 'x', 'y', 'z' } };

public static  void convert(StringBuffer num,int pos){
//num未验证合法性
if(pos==num.length()) {
System.out.println(num);
return;
}
StringBuffer snum=new StringBuffer(num);
int x=snum.charAt(pos)-49;//
for(int j=0;j<converter[x].length;j++){
snum.setCharAt(pos, converter[x][j]);
convert(snum,pos+1);
}
}

public static void main(String[] args) {
convert(new StringBuffer("123456789"),0);
}
}

#22


value[]=1234567;
str="";
for(int i;i<value.lenth;i++)
    str+="table"+value[i]+","

str2="select * form "+ str.substring(0,str.length-1)
query(str2)

#23


引用 21 楼 jayflee 的回复:
递归算法。 


Java code
public class NumberConvert {

    static char[][] converter = { { 'a', 'b', 'c' }, { 'd', 'e', 'f' }, { 'g', 'h', 'i' },
            { 'j', 'k' }, { 'l', 'm', 'n' }, { 'o', 'p', 'q' },
            { 'r', 's', 't' }, { 'u', 'v' }, { 'w', 'x', 'y', 'z' } };
    
    public static  void convert(StringBuffer num,int pos){
        //num未验证合法性
        if(pos==…


好码 保存 hoho 

#24


该回复于2008-05-01 06:22:40被版主删除

#25


该回复于2008-05-01 06:26:12被版主删除

#26


回过的帖竟然在“我回复的帖子找不到”,shit。
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告