把一个数分解成任意几个数之和,打印所有和式分解的结果

题目:把一个数分解成任意几个数之和,把一个数的所有和式分解的结果全部输出出来,
例如:4的结果有,(1+3),(2+2),(1+1+2),(1+1+1+1)

由例子可见,该程序是去重的,应为1+1+2也可以写成1+2+1 ,所以,写方法必须要去重

package org.jeecg.modules.applet.controller;

import java.util.*;

/**
 * 把一个数分解成任意几个数之和,把一个数的所有和式分解的结果全部输出出来
 * 例如:4的结果有,(1+3),(2+2),(1+1+2),(1+1+1+1)
 */
public class Composition extends ArrayList<Integer> {
    /**
     *  重写equals方法方便去重,排除掉重复的数据
     * @param other
     * @return
     */
    @Override
    public boolean equals(Object other){
        Composition comp = (Composition)other;
        Collections.sort(this);
        Collections.sort(comp);
        if(this.isEmpty() || comp.isEmpty() || this.size() != comp.size())
            return false;
        for(int i=0; i<this.size(); i++)
            if(this.get(i) != comp.get(i))
                return false;
        return true;
    }
    @Override
    public int hashCode() {
        return 0;
    }
}
class main {
    public static void main(String[] args) {
        int n=1;
        Scanner sc=new Scanner(System.in); //在控制台手动输入值  按enter键  便可得到结果
        n=sc.nextInt();
        System.out.println(toStr(calc(n)));
    }
    public static Set<Composition> calc(int n) {
        Set<Composition> devideSet = new HashSet<Composition>();
        Composition Composition = new Composition();
        switch (n) {//如果是1直接返回1
            case 1:
                Composition.add(1);
                devideSet.add(Composition);
                return devideSet;
            case 2://如果是2返回1+1
                Composition.add(1);
                Composition.add(1);
                devideSet.add(Composition);
                return devideSet;
            default:
                for (int i = 1; i <= n / 2; i++) {
                    Composition = new Composition();
                    Composition.add(i);
                    Composition.add(n - i);
                    devideSet.add(Composition);
                    if (i <= n - i) {
                        Set<Composition> partial_pos = calc(n - i);//递归调用
                        for (Composition pos : partial_pos) { //当n==2时会走这个方法
                            pos.add(i);
                            devideSet.add(pos);
                        }
                    }
                }
                return devideSet;
        }
    }
    public static String toStr(Set<Composition> devideSet) {
        String str = "";
        for (Composition de : devideSet)
            str += toStr(de);
        return str;
    }
    public static String toStr(Composition Composition) {//将数字拼接成表达式
        String str = Composition.get(0) + "";
        for (int i = 1; i < Composition.size(); i++)
            str += (" + " + Composition.get(i));
        str += "\n";
        return str;
    }
}

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 一个关系模式$R$(表)的分解$R_1$和$R_2$是分解保持依赖的,如果$R_1$和$R_2$的联接(join)可以产生$R$,并且$R_1$和$R_2$中的任何一个关系模式都包含它们在$R$中的所有属性。 下面是一个例子: 假设有一个关系模式$R(A,B,C,D)$,其中$A$是主键。$R$中存在以下依赖关系: $A \rightarrow BCD$ 现在,我们将$R$分解成两个子关系模式$R_1(A,B)$和$R_2(A,C,D)$。我们需要证明这个分解是保持依赖的。 首先,我们需要证明$R_1$和$R_2$的联接可以产生$R$。这是显然的,因为$R_1$和$R_2$都包含$A$属性,而$A$是主键。因此,我们可以使用$A$属性将这两个关系模式联接起来。 其次,我们需要证明$R_1$和$R_2$中的任何一个关系模式都包含它们在$R$中的所有属性。对于$R_1$,它包含$A$和$B$属性,因此它包含$R$中的$A$和$B$属性。对于$R_2$,它包含$A$,$C$和$D$属性,因此它也包含$R$中的所有属性。 综上所述,我们可以得出结论:$R_1$和$R_2$是分解保持依赖的。 ### 回答2: 一个分解在维持依赖的过程中,需要满足以下条件: 首先,对于关系模式R中的任意一个依赖X→Y,分解后的关系模式集合S中存在一个关系模式S_i,使得S_i中的属性集合包含了X和Y。也就是说,原依赖X→Y在分解后的关系模式中仍然存在。 其次,对于关系模式R中的任意一个依赖X→Y,如果X可以通过关系模式集合S的某一部分来确定(即X是S_i的属性子集),那么Y也可以通过同一关系模式集合S的同一部分来确定(即Y是S_i的属性)。 要证明一个分解保持依赖,可以通过如下步骤进行: 首先,确定关系模式R和它的依赖集合F。 然后,对关系模式R进行分解,生成新的关系模式集合S。 接下来,检查原有的依赖集合F是否在分解后的关系模式集合S中依然存在。如果每个依赖X→Y都可以找到在S中的关系模式S_i,其中X和Y都包含在S_i的属性集合中,那么就证明了分解保持依赖。 最后,对于F中的每个依赖X→Y,如果X是S_i的属性子集,那么Y也必须是S_i的属性。通过检查每个依赖的这个条件是否满足,可以进一步确认分解是否保持依赖。 总结起来,验证一个分解是否保持依赖需要检查分解后的关系模式中是否包含原有的依赖集合中的每个依赖,并且对于每个依赖,X可以通过分解后的关系模式的部分属性来确定,而Y也可以通过同一部分属性来确定。只有当这些条件都满足时,才能确定分解保持依赖。 ### 回答3: 在据库中,分解保持依赖指的是将一个关系模式按照某种规则进行分解,使得分解后的关系模式仍然能够保持原有的依赖关系。为了证明一个分解保持依赖,我们可以进行以下几个步骤: 1. 确定原关系模式的函依赖集合:首先,我们需要确定原关系模式的函依赖集合,这可以通过分析实际业务需求和关系模型得出。 2. 进行关系模式的分解:根据某种规则,我们将原关系模式进行分解,得到一组新的关系模式。 3. 确定新关系模式的函依赖集合:接下来,我们需要确定新关系模式的函依赖集合,这可以通过分析新关系模式的属性和关系模型得出。 4. 比较原关系模式和新关系模式的函依赖集合:我们需要比较原关系模式和新关系模式的函依赖集合,即判断原有的函依赖是否得到保留。 5. 判断分解是否保持依赖:如果新关系模式的函依赖集合和原关系模式相同或者是原关系模式的子集,那么我们可以认为分解是保持依赖的。这是因为新关系模式保留了原有的函依赖,满足了据的完整性。 通过上述步骤,我们可以证明一个分解是否保持依赖。在实际操作中,我们可以借助关系据库理论中的范式概念,如第三范式或BCNF(Boyce-Codd范式),来进行分解和依赖的验证。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值