示例:如果我取數字 4544,那么當我將數字重新排列為 5444 時,我得到的最大乘積是 2376。 (54 x 44) = 2376 大于 (45 x 44) = 1980
我解決問題的方法是以所有可能的方式排列數字,將其分成兩部分,然后從那里找到最大乘積。是否有更快的方法來解決問題,或者是否可以采用完全不同的方法來解決問題?
這是我的代碼:
import java.util.*;
class MaxProduct
{
static int maxprod = 0;
public static void main(String args[])
{
Scanner sc = new Scanner(System.in);
System.out.println("Enter a no");
String n = sc.next();
permute(n,0);
System.out.println("Max Product is " maxprod);
}
public static void permute(String s,int i)
{
if( i==s.length()-1)
{
int a = Integer.parseInt(s.substring(0,i/2 1));
int b = Integer.parseInt(s.substring(i/2 1));
maxprod = Math.max(a*b,maxprod);
}
else
{
for(int k=i;k<s.length();k )
{
s =swapelement(s,k,i);
permute(s,i 1);
s=swapelement(s,k,i);
}
}
}
public static String swapelement(String a,int i, int j)
{
char x[]=a.toCharArray();
char ch = x[i];
x[i]=x[j];
x[j]=ch;
return String.valueOf(x);
}
}
謝謝!
uj5u.com熱心網友回復:
我們先來看一個小問題。對于變數x,y
,給你
x y = c (constant)
問題是,什么時候x*y
達到最大值?它可以通過多種方式解決,其中之一是微分數學。長話短說,彼此越接近x
,他們的產品就越大。y
如何將此應用于您的問題?
- 取集合中最大的數字,將它們分配給數字(讓它們成為
A
和B
) - 一旦一個數字變得比另一個大(讓
A>B
),將剩余的數字分配為最大化B
(更大的數字按降序排列)。因為A
我們使用剩余的較小數字來使它們中的最大數字。將較大的數字分配給B
是為了使其更接近A
。
示例 #1
Number = 123456 取最大位數,A = 6 and B = 5
. 現在,我們將貪婪地最大化B
,所以數字變為A = 621 and B = 543
示例 #2
Number = 88871256 取最大位數,A = 8 and B = 8
. 由于它們仍然相等,我們重復第 1 步,所以A = 88 and B = 87
. 現在,我們將貪婪地最大化B
,所以數字變為A = 8821 and B = 8765
。
由于這是一個相當簡單的問題,添加任何實作似乎是不必要的。
uj5u.com熱心網友回復:
一種方法可以是兩個找到最高的兩個數字,并將它們保持在最左邊的位置,而不是對剩余的第二位進行相反的操作。
例如:
如果您有數字 1234,則最高數字是 3 和 4,所以讓它們保持在第一位,剩下的 2 也這樣做,所以數字將是:
(41*32) = 1312
所以在這里你看到 1312 是可能的最高數字
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/452492.html
上一篇:使用C 的選擇排序實作不正確