小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。例如:f(44) = 11.
现在给出一个N,需要求出 f(1) + f(2) + f(3).......f(N)
例如: N = 7
f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 + 1 + 3 + 1 + 5 + 3+ 7 = 21
小易计算这个问题遇到了困难,需要你来设计一个算法帮助他。
case通过率为40.00%,感觉算法挺简单的啊,出现运行时间过大,难道是因为list的操作比较耗时?
现在给出一个N,需要求出 f(1) + f(2) + f(3).......f(N)
例如: N = 7
f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 + 1 + 3 + 1 + 5 + 3+ 7 = 21
小易计算这个问题遇到了困难,需要你来设计一个算法帮助他。
输入描述:
输入一个整数N (1 ≤ N ≤ 1000000000)
输出描述:
输出一个整数,即为f(1) + f(2) + f(3).......f(N)
输入例子:
7
输出例子:
21
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
List<Integer> list=new ArrayList<Integer>();
list.add(0);
Scanner scanner=new Scanner(System.in);
//get the input value
int n=scanner.nextInt();
int result=0;
for(int i=1;i<=n;i++){
if(i%2==1){
list.add(i);
}
else{
list.add(list.get(i/2));
}
result=result+list.get(i);
}
System.out.println(result);
}
}
//运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。
case通过率为40.00%,感觉算法挺简单的啊,出现运行时间过大,难道是因为list的操作比较耗时?