如何排列数字的数字,以便当我将其分成两个相同数字时,两个数字的乘积最大?
How to arrange the digits of a number such that when I break it into two numbers of equal digits the product of the two numbers is maximum?
例子:如果我取数字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);
}
}
谢谢!
一种方法可以是两个找到两个最高的数字,并将它们放在最左边的位置,而不是为剩下的第二个位置做相反的事情。
例如:
如果你有数字 1234,最高数字是 3 和 4,所以让他们保持在第一位,剩下的 2 做同样的事情,所以数字将是:
(41*32) = 1312
所以你在这里看到 1312 是可能的最大数字
我们先来看一个小问题。对于变量x,y
,你得到
x + y = c (constant)
问题是,什么时候x*y
最大?它可以通过多种方式解决,其中之一是 differential math。长话短说,x
和 y
越接近,它们的乘积就越大。
如何将此应用于您的问题?
- 取集合中最大的数字,将它们分配给数字(让它们为
A
和B
)
- 一旦一个数字变得比另一个数字大(令
A>B
),分配剩余的数字以最大化B
(较大的数字按降序排列)。对于 A
,我们使用剩余的较小数字从中得出最大的数字。将较大的数字分配给 B
是为了使其更接近 A
.
示例 #1
人数=123456
取最大位数,A = 6 and B = 5
。现在,我们将贪婪地最大化 B
,因此数字变为 A = 621 and B = 543
示例 #2
人数=88871256
取最大位数,A = 8 and B = 8
。由于它们仍然相等,我们重复步骤 1,所以 A = 88 and B = 87
。现在,我们将贪婪地最大化 B
,因此数字变为 A = 8821 and B = 8765
.
由于这是一个相当简单的问题,因此似乎没有必要添加任何实现。
例子:如果我取数字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);
}
}
谢谢!
一种方法可以是两个找到两个最高的数字,并将它们放在最左边的位置,而不是为剩下的第二个位置做相反的事情。
例如:
如果你有数字 1234,最高数字是 3 和 4,所以让他们保持在第一位,剩下的 2 做同样的事情,所以数字将是:
(41*32) = 1312
所以你在这里看到 1312 是可能的最大数字
我们先来看一个小问题。对于变量x,y
,你得到
x + y = c (constant)
问题是,什么时候x*y
最大?它可以通过多种方式解决,其中之一是 differential math。长话短说,x
和 y
越接近,它们的乘积就越大。
如何将此应用于您的问题?
- 取集合中最大的数字,将它们分配给数字(让它们为
A
和B
) - 一旦一个数字变得比另一个数字大(令
A>B
),分配剩余的数字以最大化B
(较大的数字按降序排列)。对于A
,我们使用剩余的较小数字从中得出最大的数字。将较大的数字分配给B
是为了使其更接近A
.
示例 #1
人数=123456
取最大位数,A = 6 and B = 5
。现在,我们将贪婪地最大化 B
,因此数字变为 A = 621 and B = 543
示例 #2
人数=88871256
取最大位数,A = 8 and B = 8
。由于它们仍然相等,我们重复步骤 1,所以 A = 88 and B = 87
。现在,我们将贪婪地最大化 B
,因此数字变为 A = 8821 and B = 8765
.
由于这是一个相当简单的问题,因此似乎没有必要添加任何实现。