第一题
找到从11-n的所有超完全数,并从大到小排序
超完全数:n的长度为len,n的每位数的len次方之和等于n
比如:153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153
1634 = 1^4 + 6^4 + 3^4 + 4^4 = 1534
public class Solution {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
for (int i = Math.min(10000000,n); i >= 11; i--) {
if (fun(i)){
System.out.println(i);
}
}
}
public static boolean fun(int n) {
char[] chars = String.valueOf(n).toCharArray();
int len = chars.length;
int sum = 0;
for (char c : chars) {
sum += Math.pow(c - '0',len);
}
return sum == n;
}
}
第二题
public class Solution {
/**
*
* 输入:10000,7,[1.0, 2.0, 1.0,2.0, 2.0, 3.0, 2.0],2 输出50000.00000
* 注解:第一天1元买入10000股,第二天卖出20000元
* 第三天1元买入20000股,第六天卖出60000元,盈利50000元
*
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 根据输入计算最大收益
* @param M double浮点型 初始资金
* @param N int整型 历史价格天数
* @param historyPrices double浮点型一维数组 N天历史价格
* @param K int整型 最大允许交易次数
* @return double浮点型
*/
public static double get_max_profit (double M, int N, double[] historyPrices, int K) {
//0不操作,奇数最多持有股票数,偶数最多持有钱数
double[][] dp = new double[N][2 * K + 1];
dp[0][0] = M;
for (int i = 1; i < 2 * K + 1; i++) {
if (i % 2 == 0) {
dp[0][i] = M;
}
else {
dp[0][i] = M / historyPrices[0];
}
}
for (int i = 1; i < historyPrices.length; i++) {
for (int j = 1; j < 2 * K + 1; j++) {
if (j % 2 == 1) {
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - 1] / historyPrices[i]);
}
else {
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - 1] * historyPrices[i]);
}
}
}
return dp[historyPrices.length - 1][2 * K] - M;
}
public static void main(String[] args) {
System.out.println(get_max_profit(10000,7,new double[]{1.0, 2.0, 1.0,2.0, 2.0, 3.0, 2.0},2));
}
}