2 lahand lahand 于 2016.01.28 10:45 提问

JAVA 生成 用0到9这十个数字 所有的排列组合(0不能再第一个)

用 0到9 生成 十位数的所有排列组合,数字0不能在第一个,这个生成的十位数,
不能有重复的数字。

4个回答

rui888
rui888   Ds   Rxr 2016.01.28 11:18
已采纳
 public static void main(String[] args) {
        String str[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
        permutation(str, 0, str.length);
    }

    static void swap(String[] str, int start, int end) {
        String tmep = str[start];
        str[start] = str[end];
        str[end] = tmep;
    }

    static void permutation(String[] str, int start, int end) {

        if (start == end - 1) {
            for (int i = 0; i < end; i++) {
                System.out.print(str[i]);
            }
            System.out.println();
        } else {

            for (int i = start; i < end; i++) {
                if (i == 0 && str[0].equals("0"))
                    continue;
                swap(str, start, i);
                permutation(str, start + 1, end);

                swap(str, start, i);
            }
        }
    }
}
cuiwei1026522829
cuiwei1026522829   Ds   Rxr 2016.01.28 17:10
enpterexpress
enpterexpress   Rxr 2016.01.28 13:43
zhao_zhi
zhao_zhi   2016.01.28 17:10

C语言版本的
unsigned char str[10];
unsigned char str_file[10];
unsigned int count;
FILE fp;
/
用0到9这十个数字 所有的排列组合(0不能再第一个) 1C
用 0到9 生成 十位数的所有排列组合,数字0不能在第一个,这个生成的十位数,*/
void print(unsigned char* str1,int count)
{
int i;
for(i=0;i<count;i++)
{
printf("%d",str1[i]);
str_file[i]=str1[i]+0x30;
}
printf("\n");
}
void group(int offset,unsigned char* buffer,int depth)
{
int j,k;
unsigned char tvalue;
unsigned char* ptr;

if(depth==2)
{
    ptr=str+offset;
    memcpy(ptr,buffer+offset,depth);        
    for(k=0;k<depth;k++)
    {
        tvalue=ptr[0];
        for(j=0;j<(depth);j++)
            ptr[j]=ptr[j+1];
        ptr[depth-1]=tvalue;

        if(str[0]!=0)
        {
            //print(str,depth+offset);
            //printf("\n");
            fwrite(str_file, sizeof( char ),depth+offset,fp);   //14
            fwrite("\x0d\x0a", sizeof( char ),2,fp);
            count++;
        }
    }
}
else 
{
    ptr=buffer+offset;
    memcpy(str+offset,ptr,depth);       
    for(k=0;k<depth;k++)
    {
        str[offset]=ptr[0];
        ptr++;
        depth--;
        memcpy(str+offset+1,ptr,depth);
        group(offset+1,buffer,depth);                               
        ptr--;
        depth++;
        tvalue=ptr[k];
        for(j=0;j<(depth);j++)
            ptr[(k+j)%depth]=ptr[((k+j+1)%depth)];
        ptr[(k+depth-1)%depth]=tvalue;
    }
}
return;

}
int main(int argc, char* argv[])
{
unsigned char num[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
char bmpName[50]={"./test.txt"};
count=0;

fp=fopen(bmpName,"wb");
if(fp==NULL)
{
    fclose(fp);
    printf("文件打开失败");
    return 0;
}
fseek(fp,0,SEEK_SET);

//group(0,num,2);
//group(0,num,3);
group(0,num,10);

printf("一共%d组",count);
printf("\n");
strcpy((char*)str_file,"一共");
itoa((int)count,(char*)str_file+4,10);
strcpy((char*)str_file+8,"组");
fwrite(str_file, sizeof( char ),10,fp); //14
fwrite("\x0d\x0a", sizeof( char ),2,fp);
//关闭文件
fclose(fp);
return 0;

}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
例题7-1 除法UVa 725
题目:点击打开链接 大意:给你一个数n(2 分析:暴力枚举b,然后*n得到a,判断,a,b中是否有重复数字即可 代码: #include #include #include using namespace std; bool judge(int a,int b) { bool vis[12]; char str[12]; sprintf(str,"%05
使用0到9十个数字,组成一个和值等式
-- Created on 2010/6/14 by DUQIANG declare --给你0,1,2,3...9共10个数字,组成一个等式,2个加数是3位数,和的各位数字,2个加数的各个位上的数字不可重复 -- Local variables here i integer; j integer; n integer := 0; type tt_t i
java编程之计算16位长整型数字中0-9出现次数(从命令窗输入数据)
/* *读入一个16位的长整型,利用switch语句计算0—9这十个数字中,每个字出现的次数 **/ import java.util.Scanner; class number{ public static void main(String args[]){ Scanner s=new Scanner(System.in); System.out.println("请输入一个16
java算法----0至9这十个数组成两个三位数和一个四位数
http://yangjianzhouctgu.iteye.com/blog/1884313 Java代码   package com.zhonghaiwangluokeji.interview;     /**   * 0-9这十个数,组合成两个三位数和一个四位数   * 求出满足条件:两个三位数相加等于那个四位数   * 的所有这些数   * @author yangj
全排列——九个数排列组合得到1/3
问题:九数组分数。1, 2, 3...9 这九个数字组成一个分数,其值恰好为1/3,如何组合?编写程序输出所有的组合。 分析:九个数来说要组成三分之一只有一种可能,就是分子四位,分母五位,所以只需要对这九个数全排列,得到1/3输出即可。 #include #include #include using namespace std; void perm(int str[
java 输入一16位的整数,统计0~9这十个数字每一个出现的次数。
网上看到的一个题目,还是编编吧~不然都忘了!我的代码如下,写的不好~有毛病请指正 代码如下: public static void main (String args[]) { Tlty test = new Tlty(); String details = "123654547878564sdfsdfsf56456464646"; test.
1-9九个数字不重复组成一个三位数加法算式,求出所有组合
此题咱没想出很巧妙的解法,直接根据编程来吧 using System; using System.Collections.Generic; using System.Text; namespace RemainerMaths { class Program { static void Main(string[]
用0~9使等式##*#=#*##=###成立,数字不重复
编写程序,用数字1,2,3,4,5,6,7,8,9代替一下算式中的#,使等式成立。 ##*#=#*##=### 要求9个数字都必须用到。 正好前几天用递归解决了遍历m个元素取k个的问题,今天用同样的思路做出了全排列。 每次循环都要开一个新数组,内存开销大。 也可以把九个数字转成StringBuilder,是否内存占用会变小?如果不用递归,应该如何解决呢? import java.u
定义一个16位长整型数,统计里面0~9每个数字出现的次数。(包括将长整型转化为字符数组的方法及switch的用法)
包括将长整型转化为字符数组的方法及switch的用法static void Main(string[] args) { //定义一个16位长整型数,统计里面0~9每个数字出现的次数。 //首先定义一个长整型的数,再把它化为字符串,最后化为字符串数组,再用循环的方法将数组里的元素一个个进行排查。 long num
针对如"123456"之类的任意字符序列,输出它们所有的排列组合
思想:针对排列问题,应该将每个位置上可能出现的情况列出来,如有四个不同字符(暂时不考虑有相同情况),那么第一个位置就有四种可能的情况,当第一个位置确定后,第二个位置就只有三种情况,依次类推,最后一个位置只有一种情况,这个对于学过排列组合的人来说,很好理解,关键在于怎样用程序实现呢?根据上面的分析我们只要挨个把每个位置上出现的字符确定下来,那么这个序列就确定下来了,现在关键是我们针对某个位置出现的情况应该怎样确定呢?比如第一个位置有4种情况,而且每个位置上的字符不相同,那么就可以用整体左移或者右移一位,这样该