携程2017.4.11 编程题一

来源:互联网 发布:美得惨绝人寰知乎 编辑:程序博客网 时间:2024/06/08 19:19

乘积最大(携程2017春季招聘真题)

       
方法一:
import java.util.ArrayList;import java.util.List;import java.util.Scanner;/** * 有一个整数n,将n分解成若干个不同自然数之和,问如何分解能使这些数的乘积最大,输出这个乘积m * 155ms */public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while(scanner.hasNext()){int n = scanner.nextInt();System.out.println(getMax(n));}scanner.close();}private static int getMax(int n) {int max = 1;int i = 2;List<Integer> list = new ArrayList<>();while(n>=i){list.add(i);n = n-i;i++;}for(int k=list.size()-1,j=0;j<n;j++,k--){list.set(k, list.get(k)+1);}for (Integer integer : list) {max *= integer;}return max;}}
方法二:
import java.util.Scanner;//238mspublic class Main {    public static void main(String[] args){        int n;        Scanner scanner=new Scanner(System.in);        n=scanner.nextInt();        if(n==1)            System.out.println(0);        if(n==2)            System.out.println(1);        if(n==3)            System.out.println(2);        if(n==4)            System.out.println(3);        int result=1;        int[] factor=new int[n];        int length=n;        for(int i=2;i<50;i++){           if(n-i<=i){               factor[i-2]=i;               n=n-i;               while(n!=0) {                   for (int j = (i - 2); j >= 0; j--) {                       if (n != 0) {                           factor[j]++;                           n--;                       } else                           break;                   }               }               break;           }           else{               n=n-i;               factor[i-2]=i;           }        }        for(int i=0;i<length;i++){            if(factor[i]==0) {                break;            }            else                result*=factor[i];        }        System.out.println(result);    }}
//////////////////////////////////////////////////////////////////////////////////////////
import java.util.Scanner;//230mspublic class Main {    public static int maxProduct(int n) {        int []a = new int[n];        int sum = 0, l = 0;        for (int i = 2; i <= n; i++) {            a[l++] = i;            sum += i;            if (sum > n) {                sum -= i;                l--;                break;            }        }        int left = n - sum;        for (int i = l - 1; left > 0; left--) {            a[i--]++;            if (i < 0) i = l - 1;        }        int res = 1;        for (int i = 0; i <= l-1; i++)            res *= a[i];        return res;    }    public static void main(String []args) {        Scanner sc = new Scanner(System.in);        int n = sc.nextInt();        System.out.println(maxProduct(n));    }}
//相邻为1的乘积最大



1 0
原创粉丝点击