亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

查找并打印 x1+x2+x3=num 的解數

查找并打印 x1+x2+x3=num 的解數

慕的地8271018 2022-12-28 15:41:44
我需要編寫一個recusive函數,它接收一個整數num并返回方程的解數:x1 + x2 + x3 = num,其中x1,x2,x31-10 之間的數字,該方法應打印所有解。例如,如果num=3那么該方法將打印1+1+1并返回1。如果num=5該方法將返回6并打?。? + 1 + 31 + 2 + 21 + 3 + 12 + 1 + 22 + 2 + 13 + 1 + 1如果num<3或num>30方法將返回0.該方法應該是遞歸的而不使用循環。不允許使用全局變量。列表也是不允許的。這是我的代碼,它工作正常但它也打印重復項,因為num=5它打?。? + 1 + 12 + 2 + 12 + 1 + 22 + 2 + 11 + 3 + 11 + 2 + 22 + 1 + 21 + 2 + 21 + 1 + 3這是我的代碼:public static void main(String[] args) {    System.out.println("num of solutions: "+solutions(5));}public static int solutions(int num) {    if (num < 3 || num > 30)        return 0;    return solutions(num, 1, 1, 1);}private static int solutions(int num, int x1, int x2, int x3){    if (x1 < 1 || x1 > 10 || x2 < 1 || x2 > 10||x3 < 1 || x3 > 10)        return 0;    if (x1 + x2 + x3 > num)        return 0;           if (x1 + x2 + x3 == num)    {        System.out.println(x1 + " + " + x2 + " + " + x3);        return 1;    }               return solutions(num, x1 + 1, x2, x3) + solutions(num, x1, x2 + 1, x3) + solutions(num, x1, x2, x3 + 1);}如何在沒有重復的情況下獲得所需的輸出?
查看完整描述

4 回答

?
神不在的星期二

TA貢獻1963條經驗 獲得超6個贊

你得到重復的原因是兩者solutions(1,2,1)都會solutions(2,1,1)引導你到2 + 2 + 1.


不重復三位數的簡單方法是從 111 遞增到 10,10,10,就好像它是一個十進制整數一樣:


private static int solutions(int num, int x1, int x2, int x3)

{

  if (x1 > 10 || x1 > num)

    return 0;

  if (x2 > 10 || x1+x2 > num)

    return solutions(num, x1+1, 1, 1);

  if (x3 > 10 || x1+x2+x3 > num)

    return solutions(num, x1, x2+1, 1);


  int me = 0;

  if (x1+x2+x3 == num) {

    System.out.printf("%d + %d + %d\n", x1, x2, x3);

    me=1;

  }

  return me + solutions(num, x1, x2, x3+1);

}

這模仿了您通過修剪搜索整個空間的方法,但更有效的解決方案可以只搜索x1和x2并設置x3=num-x1-x2。


查看完整回答
反對 回復 2022-12-28
?
白板的微信

TA貢獻1883條經驗 獲得超3個贊

我們可以使用字符串來解決這個問題。聲明一個全局字符串變量


static String str=""; // taken null intially

現在,我們可以使用這個字符串 str 來存儲序列并檢查它是否已經出現在前面。這樣我們就可以跟蹤重復的問題,您將得到答案。我已附上我的代碼如下。


private static int solutions(int num, int x1, int x2, int x3)

{

    if (x1 < 1 || x1 > 10 || x2 < 1 || x2 > 10||x3 < 1 || x3 > 10)

        return 0;

    if (x1 + x2 + x3 > num)

        return 0;       

    if (x1 + x2 + x3 == num)

    {

        String s= String.valueOf(x1)+"+"+String.valueOf(x2)+"+"+String.valueOf(x2);

        if(!str.contains(s))

        {

            str=str+s+"\n";

            System.out.println(x1 + " + " + x2 + " + " + x3);

            return 1;

        }

    }           

    return solutions(num, x1 + 1, x2, x3) + solutions(num, x1, x2 + 1, x3) + solutions(num, x1, x2, x3 + 1);


}


查看完整回答
反對 回復 2022-12-28
?
胡子哥哥

TA貢獻1825條經驗 獲得超6個贊

好吧......沒有集合,沒有全局變量,沒有重復項。我希望你被允許使用 StringBuilder?


public static void main(String[] args) {

    StringBuilder sb = new StringBuilder();


    System.out.println("num of solutions: " + solutions(5, sb));


    System.out.println(sb.toString());

}


public static int solutions(int num, StringBuilder sb) {

    if (num < 3 || num > 30)

        return 0;


    return solutions(num, 1, 1, 1, sb);

}


private static int solutions(int num, int x1, int x2, int x3, StringBuilder sb) {

    if (x1 > 10 || x2 > 10 || x3 > 10) {

        return 0;

    }


    if (x1 + x2 + x3 > num) {

        return 0;

    }


    if (x1 + x2 + x3 == num) {

        String str = x1 + " + " + x2 + " + " + x3;

        if (!sb.toString().contains(str)) {

            sb.append(str).append(System.lineSeparator());

            return 1;

        }

    }


    return solutions(num, x1 + 1, x2, x3, sb) 

           + solutions(num, x1, x2 + 1, x3, sb) 

           + solutions(num, x1, x2, x3 + 1, sb);

}

結果:


    num of solutions: 6

    3 + 1 + 1

    2 + 2 + 1

    2 + 1 + 2

    1 + 3 + 1

    1 + 2 + 2

    1 + 1 + 3


查看完整回答
反對 回復 2022-12-28
?
森欄

TA貢獻1810條經驗 獲得超5個贊

試試這個 :


public static void main(String... args) {

    System.out.println(solutions(5));

}

public static int solutions(int n) {


    if (n < 3 || n > 30) return 0;

    return solutions(n, n-2, 1, 1, 0);


}


public static int solutions(int n, int x1, int x2, int x3, int solutions) {


    ++solutions;

    System.out.println("Solution found : "+x1 +"+" + x2 + "+" + x3);


    if(x3 == n-2) return solutions;


    if(x2 > 1) {

        return solutions(n, x1, x2-1, x3+1, solutions);

    }


    if(x1 > 1) {

        return solutions(n, x1-1, n-x1, 1, solutions);

    }

    return solutions;

}

輸出:6


這個想法如下:


您從盡可能大的 x1 開始。


然后你遵循這兩個規則:


如果 x2 > 1 則 x2 = x2 - 1 且 x3 = x3 + 1


如果不是,并且如果 x1 > 1 THEN x1 = x1 - 1,x3 = 1 和 x2 = 獲得正確總數所需的數量。


如果這兩個條件都不成立,則沒有更多的解決方案。


結果 :


3 + 1 + 1


第一個條件為假,第二個條件為真:我們將 1 移至 x1,x3 變為 1,x2 變為邏輯上的 2


2 + 2 + 1


第一個條件為真。我們從 x2 中刪除 1,然后將 1 添加到 x3


2 + 1 + 2


第一個條件為假


第二個條件為真


1 + 3 + 1


第一個條件為真


1 + 2 + 2


第一個條件為真


1 + 1 + 3


第一個條件為假,第二個為假。


我們有 6 個解決方案,就是這樣。


希望有所幫助!


查看完整回答
反對 回復 2022-12-28
  • 4 回答
  • 0 關注
  • 138 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號