精华内容
下载资源
问答
  • 出差期间,看到大学老师教孩子写作业,有这么个问题,突然好奇可不可以用代码实现以下,所以上网搜了下java计算排列组合的知识,觉得受益匪浅。 以下为借鉴别人排列组合的代码写出来的解决方法。 import java....

    出差期间,看到大学老师教孩子写作业,有这么个问题,突然好奇可不可以用代码实现以下,所以上网搜了下java计算排列组合的知识,觉得受益匪浅。

    以下为借鉴别人排列组合的代码写出来的解决方法。

    import java.util.ArrayList;
    import java.util.List;
    
    public class testadd5 {
    	static List<int[]> allSorts = new ArrayList<int[]>();
    
    	public static void permutation(int[] nums, int start, int end) {
    		if (start == end) { // 当只要求对数组中一个数字进行全排列时,只要就按该数组输出即可
    			int[] newNums = new int[nums.length]; // 为新的排列创建一个数组容器
    			for (int i = 0; i <= end; i++) {
    				newNums[i] = nums[i];
    			}
    			allSorts.add(newNums); // 将新的排列组合存放起来
    		} else {
    			for (int i = start; i <= end; i++) {
    				int temp = nums[start]; // 交换数组第一个元素与后续的元素
    				nums[start] = nums[i];
    				nums[i] = temp;
    				permutation(nums, start + 1, end); // 后续元素递归全排列
    				nums[i] = nums[start]; // 将交换后的数组还原
    				nums[start] = temp;
    			}
    		}
    	}
    
    	public static int evaluate(int[] num) {
    		permutation(num, 0, num.length - 1);
    		int[][] a = new int[allSorts.size()][]; // 你要的二维数组a
    		allSorts.toArray(a);
            int n=0;
            int threeend = 0;
            int twoend = 0;
    		// 打印验证
    		for (int i = 0; i < a.length; i++) {
    			int[] nums = a[i];
    //			for (int j = 0; j < nums.length; j++) {
    //				System.out.print(nums[j]);
    //			}
    //          此循环可以打印出所有结果
    			int three=nums[0]*100+nums[1]*10+nums[2];
    			int two=nums[3]*10+nums[4];
    			int nu=three*two;
    			if(n<nu) {
    				n=nu;
    				threeend=three;
    				twoend=two;
    			}
    //			System.out.println();
    		}
    		System.out.println("组合方式个数:"+a.length);
    		System.out.println("最大值组合方式为:"+threeend+"*"+twoend);
    		return n;
    	}
    	public static void main(String[] args) {
    		int[] numArray = {1,2,3,4,5};
    		System.out.println(evaluate(numArray));
    	}
    
    }

    我借鉴的那人巧妙的用了递归,从后向前开始排列所有组合,一开始我没读懂递归来实现的方式,看了打印结果发现,他是一开始直接递归到最底层,然后一步步从后向前来实现。比我一开始死脑筋,一直在想怎么从前向后实现巧妙的很多。

    此为借鉴代码出处:https://blog.csdn.net/qq_43493747/article/details/89931179

    展开全文
  • 生成5位 1到11的数字 这五位数字不可重复 1-11取所有五位的全排列 然后对获得到的所有五位数进行全排列 大概五万多种组合 求大佬写代码
  • 实现思路: 第一步:6位数的密码,且需要包括字符、数字、特殊符号这...第步:将laststr中的元素再次打散随机排列组合。此时就能得到一个6位数的随机密码 #生成一个随机密码,不少于6位数(目前下方代码只实现了.

    实现思路:

    第一步:6位数的密码,且需要包括字符、数字、特殊符号这三个元素。将三个元素组成6位时每个元素的排列组合列举出来

    第二步:从第一步的排列组合中随机抽取一个排列组合类型(i,j,k)

    第三步:从所有的字符、数字、特殊符号中随机抽取i个字符,j个数字,k个特殊符号

    第四步:将i个字符,j个数字,k个特殊符号组成一个6位数的密码'laststr '

    第五步:将laststr中的元素再次打散随机排列组合。此时就能得到一个6位数的随机密码

    #生成一个随机密码,不少于6位数(目前下方代码只实现了6位数的密码组合),且需要包括字符、数字、特殊符号
    
    import random
    from random import shuffle
    import string
    #打印所有大写字母,小写字母,数字,特殊符号
    sletters = string.ascii_letters
    sdigits = string.digits
    spunctuation = string.punctuation
    
    #获取6位数的密码,字符、数字、特殊符号组合的排序方式
    Option = [[i, j, k] for i in range(1,5) for j in range(1,5) for k in range(1,5) if i + j + k == 6]
    Optionitems = Option[random.randint(0, len(Option)-1)]
    
    slettersitems = [random.choice(sletters) for i in range(Optionitems[0])]
    sdigitsitems = [random.choice(sdigits) for i in range(Optionitems[1])]
    spunctuationitems = [random.choice(spunctuation) for i in range(Optionitems[2])]
    
    #将随机获得的字符 数字 特殊符号组合成密码
    laststr = ''.join(slettersitems) + ''.join(sdigitsitems) + ''.join(spunctuationitems)
    
    print(laststr)   #打印原始密码
    laststr1 = list(laststr)
    shuffle(laststr1)
    print(''.join(laststr1))   #原始密码乱序输出

    缺点:

    1、利用最原始的编程方法实现,实现步骤繁琐,代码过于冗余,不易解读

    2、无异常情况的考虑

    3、其他缺点待发掘。。。待改进(202005182233记)

    有错误请帮忙指出,谢谢。

    展开全文
  • 数字大于另一个数字,要么位数多,要么位数相同,字典序大,位数多可以很方便地用组合数学来解决,所以只剩下了位数相同的情况,如何实现呢,我们考虑定义状态dp[i][j][0/1]分别表示s串前i个字符中长度为j的串前面的...

    subsequence 1

    题意

    给出两个数字串s,t,求s的子序列中在数值上大于t串的数量

    分析

    数字大于另一个数字,要么位数多,要么位数相同,字典序大,位数多可以很方便地用组合数学来解决,所以只剩下了位数相同的情况,如何实现呢,我们考虑定义状态dp[i][j][0/1]分别表示s串前i个字符中长度为j的串前面的字符等于t串相应长度的前缀的数量,1则表示大于的数量 ,然后分三种情况转移即可。

    #include<bits/stdc++.h>
    #define ll long long
     
    using namespace std;
    const ll P=998244353;
    const int maxn=3005;
    const int M=3005;
    char s[maxn],t[maxn];
    ll dp[maxn][maxn][2];
    ll F[maxn],Finv[maxn],inv[maxn];
    ll pw(ll bs,ll x){
        ll ans=1;
        while(x){
            if(x&1)ans=ans*(bs%P)%P;
            bs=bs*(bs%P)%P;
            x>>=1;
        }
        return ans;
    }
    void init(){
        F[1]=Finv[1]=inv[1]=Finv[0]=inv[0]=1;
        for(int i=2;i<M;i++)inv[i]=inv[P%i]*(P-P/i)%P;
     
        for(int i=2;i<M;i++){
            Finv[i]=Finv[i-1]*inv[i]%P;
            F[i]=F[i-1]*i%P;
        }
    }
             
    ll C(int n,int m){
        if(m<0||n<m)return 0;
        if(m==0||n==m)return 1;
        return F[n]%P*(Finv[n-m]%P)%P*Finv[m]%P;
    }
    int main(){
        int n,m;
        int T;
        scanf("%d",&T);
        init();
        while(T--){
            scanf("%d%d",&n,&m);
            scanf("%s%s",s+1,t+1);
            for(int i=0;i<=n;i++)for(int j=0;j<=m;j++)for(int k=0;k<2;k++)dp[i][j][k]=0;
            dp[0][0][0]=1;
            for(int i=1;i<=n;i++){
                dp[i][1][0]=dp[i-1][1][0];
                dp[i][1][1]=dp[i-1][1][1];
                if(s[i]==t[1]&&t[1]!='0'){dp[i][1][0]++;dp[i][1][0]%=P;}
                if(s[i]>t[1]){dp[i][1][1]++;dp[i][1][1]%=P;}
     
                for(int j=2;j<=max(m,i);j++){
     
                    if(s[i]<t[j]){
                        dp[i][j][0]=dp[i-1][j][0];
                        dp[i][j][1]=(dp[i-1][j][1]+dp[i-1][j-1][1])%P;
                    }
                    else if(s[i]==t[j]){
                    dp[i][j][0]=(dp[i-1][j][0]+dp[i-1][j-1][0])%P;
                    dp[i][j][1]=(dp[i-1][j-1][1]+dp[i-1][j][1])%P;
                    }
                    else if(s[i]>t[j]){
                        dp[i][j][1]=(dp[i-1][j-1][0]+dp[i-1][j-1][1]+dp[i-1][j][1])%P;
                        dp[i][j][0]=dp[i-1][j][0];
                    }
                }
            }
            long long  sum=dp[n][m][1];
            /*for(int i=m;i<=n;i++){
                sum=dp[i][m][1];sum%=P;
            }*/
     
            for(int i=1;i<=n-m;i++){
                if(s[i]=='0')continue;
                for(int j=m;j<=n-i;j++){
                    sum+=C(n-i,j);sum%=P;
                }
            }
            printf("%lld\n",sum);
            //cout<<sum<<endl;
      
            /*for(int i=1;i<=n;i++){
                for(int j=1;j<=m;j++){
                    cout<<"1 :"<<dp[i][j][1]<<" 0: "<<dp[i][j][0]<<"   ||";
                }
                cout<<endl;
            }*/
        }
        return 0;
    }

    转载于:https://www.cnblogs.com/ttttttttrx/p/11407555.html

    展开全文
  • 【程序11】  题目:有1、2、3、4个数字... 个互不相同且无重复数字的m位数。 即:   扩展: 排列的定义:从n个不同元素中,任取m(m≤n,m与n均为自然数,下同)个元素按照一定的顺序排成一列,叫
    【程序11】 

    题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 

    思路:全排列,n个数字,能组成Anm    互不相同且无重复数字的m位数。

    即:

     




    扩展:

    排列的定义:从n个不同元素中,任取m(m≤n,m与n均为自然数,下同)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列;从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号 A(n,m)表示。
    计算公式:
      
    此外规定0!=1(n!表示n(n-1)(n-2)...1,也就是6!=6x5x4x3x2x1 
    组合的定义:从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。用符号 C(n,m) 表示。
    计算公式:
      
    ;C(n,m)=C(n,n-m)。(n≥m)
    其他排列与组合公式 从n个元素中取出m个元素的循环排列数=A(n,m)/m!=n!/m!(n-m)!. n个元素被分成k类,每类的个数分别是n1,n2,...nk这n个元素的全排列数为 n!/(n1!×n2!×...×nk!). k类元素,每类的个数无限,从中取出m个元素的组合数为C(m+k-1,m)。

    解答代码:
    package wn.comeOn.java.test.arithmetic50;
    
    import java.util.ArrayList;
    
    public class Arrangement {
    
    	// 阶乘
    	public static int factorial(int n) {
    
    		if (n == 0 || n == 1) {
    			return 1;
    		}
    
    		for (int i = 0; i < n; i++) {
    			return n * factorial(--n);
    		}
    
    		return 0;
    	}
    
    	// 排列:
    	public static int arrangement01(int n, int m) {
    
    		return factorial(n) / factorial(n - m);
    	}
    
    	// 组合:
    	public static int arrangement02(int n, int m) {
    
    		return factorial(n) / (factorial(m) * factorial(n - m));
    	}
    
    	// 有1、2、3、4个数字,全排列,三位数,都是多少?
    	public static void arrange01() {
    
    		int i = 0; // 保存百位上的数
    		int j = 0; // 保存十位上的数
    		int k = 0; // 保存各位上的数
    		int count = 0;
    		for (i = 1; i <= 4; i++) {
    			for (j = 1; j <= 4; j++) {
    				for (k = 1; k <= 4; k++) {
    					if (i != j && j != k && i != k) {
    						System.out.println(++count + ":" + (i * 100 + j * 10 + k));
    					}
    				}
    			}
    		}
    
    	}
    
    	// 有1、2、3、4个数字,组合,都是多少?
    	public static void arrange02() {
    
    		int i = 0; // 保存百位上的数
    		int j = 0; // 保存十位上的数
    		int k = 0; // 保存各位上的数
    		int count = 0;
    		ArrayList<Integer> arr = new ArrayList<>();
    
    		for (i = 1; i <= 2; i++) {
    			for (j = 2; j <= 3; j++) {
    				for (k = 3; k <= 4; k++) {
    					if (i != j && j != k && i != k) {
    						int tmp = i * 100 + j * 10 + k;
    						arr.add(tmp);
    						System.out.println(++count + ":" + tmp);
    					}
    				}
    			}
    		}
    
    	}
    
    	public static void main(String[] args) {
    
    		// System.out.println("4的阶乘为:" + factorial(4));
    
    		System.out.println("4个数字,能组成" + arrangement01(4, 3) + "个互不相同且无重复数字的3位数");
    		System.out.println("排列:" + arrangement01(4, 3));
    		arrange01();
    
    		System.out.println();
    		System.out.println("组合:" + arrangement02(4, 3));
    		arrange02();
    	}
    
    }
    

    输出结果:
    4个数字,能组成24个互不相同且无重复数字的3位数
    排列:24
    1:123
    2:124
    3:132
    4:134
    5:142
    6:143
    7:213
    8:214
    9:231
    10:234
    11:241
    12:243
    13:312
    14:314
    15:321
    16:324
    17:341
    18:342
    19:412
    20:413
    21:421
    22:423
    23:431
    24:432
    
    组合:4
    1:123
    2:124
    3:134
    4:234
    









    展开全文
  • 不相邻组合问题

    2014-11-23 16:22:00
    求满足下列条件的五位数的个数:任意两个数位上的数字之差的绝对值不小于2.
  • 今天来分享一道有意思的数学题目,题目来自知乎的一个提问,具体题目是这样的:有多少个含有不同数字五位数abcde使得a>b>c>d>e?乍一看这是一道高中数学题目,所用的知识无非就是排列组合的知识,下面...
  • 写一个程序,对于一个给定的五位数,把这个数分成几个独立的数字,然后打印出彼此相隔4个空格的数字。 [提示:使用整数除法和余数运算的组合。] 例如,如果用户输入42139,程序应该打印出来 4 2 1 3 9 /* Name:...
  • 出一个排列组合问题 0到9共10个数选出5个数字组成一个五位数(可以重复)有多少排列组合方式? 00000-99999 一共10万种排列组合方式 从中抽取一组数字,猜中的概率为10万分之一。 幸运的是你乃真命天子,你猜中...
  • 组合数学(1)

    2018-07-23 10:45:16
    poj3252 题意:给出两个数n,m,求出其区间中round number的个数,round number即满足在二进制...对于数字21,它的二进制写法为 10101,共位,我们首先求得位数低于位的round number有多少,例如在求四位roun...
  • 一、Excel四舍入方法一:使用功能选项(一)使用“减少小数位数”四舍入选择“开始”选项卡,选中要四舍入的单元格,单击“数字”组上面的“减少小数位数”图标,单元格中的两位小数变为四舍入后的一位小数...
  • 主要解决相邻或者不...把1,2,3,4,5组成没有重复数字数字 1,2不相邻的五位数,则所有不同排法有多少种? 解析:本题直接解答较为麻烦,因为可先将 3,4,5三个元素排定,共有A(3,3)种排法,然后再将 1,...
  • 篇成长博客

    2020-02-14 17:42:23
    实现一个6位数的验证码(数字与字母的组合体) import random #首先导入随机数模块 checkcode ='' #定义向向量 for i in range(6): # 使用for循环 current = random.randrange(1,6) #猜一个数字 if current == i...
  • 不用编程,能直接计算正确么?

    千次阅读 2012-05-19 10:28:18
    有这样一道题:一个五位数,它每一位上出现的数字都至少是两个,问一共有多少个这样的五位数。比如11222、21212就是满足条件的,而34435就是不满足条件的。不用计算机编程,直接用排列组合来计算,看看你算出的结果...
  • 欧拉计划 32

    2016-12-21 21:20:27
    例如,15234这个五位数,是1到5pandigital的。7254是一个不寻常的数,因为:39 × 186 = 7254这个算式的乘数,被乘数和乘积组成了一个1到9的pandigital组合。找出所有能够组合成1到9pandigital的乘法算式中乘积的和...
  • <MEMORY>Project Euler NO32

    2014-01-27 15:48:53
    例如,15234这个五位数,是1到5pandigital的。 7254是一个不寻常的数,因为:39 × 186 = 7254这个算式的乘数,被乘数和乘积组成了一个1到9的pandigital组合。 找出所有能够组合成1到9pandigital的乘法算式中...
  • 今天给大家分享一下Excel都有哪些常用的数学函数...语法:=ROUND(数字,四舍入的位数)比如保留两位小数:=ROUND(9.867,2),返回结果9.87。02INT函数该函数主要功能将数值向下取整为最接近的整数。语法:=INT(数字)...
  • Number.toFixed(n) 方法可把 Number 四舍入为小数位数为n的数字。 js 校验字符串是否为数字和字母组合: /^[0-9a-zA-Z]$/.test() //true,说明有英文字母或数字 var p = /[0-9]/; var b = p.test(string);//true,...
  • abcde/fghij=n

    2019-01-12 10:59:06
    abcde/fghij=n,其中a~j为数字0~9的不同排列.n的值从2到79。统计这样的组合一共有多少个。...然后就是判断n和i*n是否由0-9十个不同地数字排列组合而成的两个五位数。设置一个判断函数,在函数内定义一个长度为十...
  • 第四项为功率,用数宇与字母的组合表示,第项为标称阻值,其阻值大于或等于10Ω时,用三位数表示,第一、第二位数是阻值的有效数字,第三位数字表示有效数字后面"0"的个数,即10的指数。当阻值小于10Ω时,用数字...
  • 1、编写函数判断某年某月某日这一年中是第几天,在主函数中调用该函数。 2、求组合数!!!...10、给出一个五位数,输出几位数字,打印出各位数字并逆序打印出各位数字。 11、求和,Sn=a+aa+aaa..
  • 身份证校验码

    千次阅读 2019-09-16 11:07:48
    目录身份证号码身份证的组成结构地址码(前六位数)出生日期码(第七位至十四位)顺序码(第十位至十七位)校验码(第十八位数)计算方法 身份证号码 身份证号码中的校验码是身份证号码的最后一位,是根据GB ...
  • Java中的二进制

    2020-09-19 08:55:34
    计算机是由无数个逻辑电路组成的,通过0和1的无限位数组合来表达信息。也就是说,计算机是采用二进制来表示数据的。为了说清楚二进制,先说一下我们生活中常用的十进制,十进制看起来很简单,那是因为我们从小接受...
  • 博主的话:推荐给域名投资者的这一款工具经过博主长期使用,其...指定位数排列组合生成英文字母、数字(a-z 0-9),也可利用现有词典导入生成指定后缀域名。在生成域名时可指定前后加入指定字符串。 目前支持的域名后缀
  • 随机UUID的生成

    千次阅读 2017-12-04 15:04:11
    UUID的组成UUID是由一组32位数的16进制数字所构成,以连字号分为段。UUID由以下几部分组合: 1.当前日期和时间,UUID的第一个部分与时间有关,如果在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分
  • 校验身份证是否合法

    2016-01-21 09:24:27
    1、号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。 2、地址码(前六位数)表示编码...
  • 面试(求年龄)问题

    2012-12-03 13:30:24
    一人岁数的3次方是四位数,四次方是六位数,并知道此人岁数的3次方和4次方用遍了0~9十个数字。编写一程序求此人的岁数。 2。对1,2,3, 4, 5 这个数任意取出两个数,列出他们的所有组合。 public static ...
  • 验证身份证号码是否正确

    千次阅读 2010-06-30 10:52:00
    1、号码的结构公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。2、地址码(前六位数)表示编码对象...

空空如也

空空如也

1 2 3 4
收藏数 72
精华内容 28
关键字:

五位数数字组合