把一个数分解成任意几个数之和全部结果

package com.codser;


import java.util.HashSet;

public class App
{
    /**
     * 临时的构建内部类
     */
    static class Construct{
        int left; // 拆的第一个数  eg:拆5 left=1,right=4
        int right; // 与拆的第一个数互补的数
        String complement; // 补充1的片段
        public Construct(int left,int right,String complement){
            this.left=left;
            this.right=right;
            this.complement=complement;
        }
        public int getLeft() {
            return left;
        }

        public void setLeft(int left) {
            this.left = left;
        }

        public int getRight() {
            return right;
        }

        public void setRight(int right) {
            this.right = right;
        }

        public String getComplement() {
            return complement;
        }

        public void setComplement(String complement) {
            this.complement = complement;
        }

        @Override
        public String toString() {
            return "Construct{" +
                    "left=" + left +
                    ", right=" + right +
                    ", complement='" + complement + '\'' +
                    '}';
        }
    }
    public static void main( String[] args )
    {
        // 要拆的数
        int num=5;
        // 拆的临时数组
        Construct[][] tempConstruct=new Construct[num+1][];
        // 构建的结果
        HashSet<String>res=new HashSet<String>();
        // 将不用的置空
        tempConstruct[0]=null;
        tempConstruct[1]=null;
        // 按需构建二维数组并填充拆开的数据
       for(int i=2;i<=num;i++){
           tempConstruct[i]=new Construct[i-1];
           int index=0;
            for(int j=1;j<i;j++){
                StringBuilder str=new StringBuilder();
                for(int z=0;z<(num-i);z++){
                    str.append("1+");
                }
                // 去掉末尾的加号并添加到构建对象中
                tempConstruct[i][index++]=new App.Construct(j,i-j,str.length()>0?str.toString().substring(0,str.length()-1):str.toString());
            }
       }
       // 构建结果
        for(int i=2;i<=num;i++){
            for(int j=0;j<tempConstruct[i].length;j++){
                Construct construct=tempConstruct[i][j];
                if(construct.getComplement().equals("")){
                    res.add(construct.getLeft()+"+"+construct.getRight());
                    res.add(construct.getRight()+"+"+construct.getLeft());
                }else{
                    res.add(construct.getLeft()+"+"+construct.getRight()+"+"+construct.getComplement());
                    res.add(construct.getComplement()+"+"+construct.getLeft()+"+"+construct.getRight());
                    res.add(construct.getRight()+"+"+construct.getComplement()+"+"+construct.getLeft());
                }
            }
        }
        // 打印结果
        System.out.println(num+"所拆的个数:"+res.size());
        for (String string : res) {
            System.out.println(num+"="+string);
        }

    }


}


要从键盘输入任意并将其分解成两个素之和,首先需要了解个关键点: 1. **偶性质**:所有偶(除了2)都可以表示为两个素之和,因为2是最小的素,其他偶都是由2和其他素相乘得到的。 2. **算法流程**:可以采用暴力搜索的方式来尝试找寻这样的素对。对于输入的偶n,我们可以从最小的素(3开始)开始,一直寻找是否存在两个素p和q使得p + q = n。 - 遍历每个大于sqrt(n)的素p(因为如果存在这样的素对,其中一个必然小于等于sqrt(n),另一个大于sqrt(n)) - 检查是否能找到另一个q = n - p - 如果q也是素,则找到了解,返回(p, q) - 否则继续下一个p 3. **素判断**:需要一个方法来判断一个是否为素,通常的做法是检查它是否有除1和自身以外的因子。 下面是一个简单的Python示例,实现了这个功能: ```python import math def is_prime(num): if num <= 1: return False for i in range(2, int(math.sqrt(num)) + 1): if num % i == 0: return False return True def find_prime_sum(input_num): if input_num == 2: return (2, 2) for p in range(3, int(input_num / 2) + 1): # 只需查找半径内的素 if is_prime(p): q = input_num - p if is_prime(q): return (p, q) # 输入示例 input_even = int(input("请输入一个:")) if find_prime_sum(input_even): prime_pair = find_prime_sum(input_even) print(f"{input_even} 可以分解为 {prime_pair[0]} 和 {prime_pair[1]} 的和") else: print(f"{input_even} 无法表示为两个素之和(可能是奇)。")
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值