1、
小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题:
定义函数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
小易计算这个问题遇到了困难,需要你来设计一个算法帮助他。
输入描述:
输入一个整数N (1 ≤ N ≤ 1000000000)
输出描述:
输出一个整数,即为f(1) + f(2) + f(3)…….f(N)
输入例子:
7
输出例子:
21
import java.util.Scanner; /** * 对于某个N,如果N为偶数那么最大奇数因子就变为f(N/2),如果N为奇数那么就是它本身 */ public class Main { public static void main(String[] arg) { Scanner scan = new Scanner(System.in); while (scan.hasNext()) { long n = scan.nextLong(); System.out.println(solve(n)); } scan.close(); } private static long solve(long n) { long result = 0; while (n > 0) { if ((n & 1) == 0) { result += (n * n) >> 2; n = n >> 1; }else { result += n; --n; } } return result; } }
2、
小易有一个圆心在坐标原点的圆,小易知道圆的半径的平方。小易认为在圆上的点而且横纵坐标都是整数的点是优雅的,小易现在想寻找一个算法计算出优雅的点的个数,请你来帮帮他。
例如:半径的平方如果为25
优雅的点就有:(+/-3, +/-4), (+/-4, +/-3), (0, +/-5) (+/-5, 0),一共12个点。
输入描述:
输入为一个整数,即为圆半径的平方,范围在32位int范围内。
输出描述:
输出为一个整数,即为优雅的点的个数
输入例子:
25
输出例子:
12
import java.util.Scanner; public class Main { public static void main(String[] arg) { Scanner scan = new Scanner(System.in); while (scan.hasNext()) { int r2 = scan.nextInt(); System.out.println(solve(r2)); } scan.close(); } private static int solve(int r2) { int count = 0; for (int x = 1; ; x++) { int x2 = x * x; if (x2 > r2) { break; } int y = (int) Math.sqrt(r2 - x2); if (x2 + y * y == r2) { ++count; } } return count * 4; } }
3、
对于一个整数X,定义操作rev(X)为将X按数位翻转过来,并且去除掉前导0。例如:
如果 X = 123,则rev(X) = 321;
如果 X = 100,则rev(X) = 1.
现在给出整数x和y,要求rev(rev(x) + rev(y))为多少?
输入描述:
输入为一行,x、y(1 ≤ x、y ≤ 1000),以空格隔开。
输出描述:
输出rev(rev(x) + rev(y))的值
输入例子:
123 100
输出例子:
223
import java.util.Scanner; public class Main { private static int rev(int x) { String str = String.valueOf(x); String s = new StringBuilder(str).reverse().toString(); return Integer.parseInt(s); } public static void main(String[] arg) { Scanner scan = new Scanner(System.in); while (scan.hasNext()) { int x = scan.nextInt(); int y = scan.nextInt(); x = rev(x); y = rev(y); System.out.println(rev(x + y)); } scan.close(); } }
4、
如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:
{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列,
{1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。
现在给出一个数字序列,允许使用一种转换操作:
选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和)。
现在对于所给序列要求出最少需要多少次操作可以将其变成回文序列。
输入描述:
输入为两行,第一行为序列长度n ( 1 ≤ n ≤ 50)
第二行为序列中的n个整数item[i] (1 ≤ iteam[i] ≤ 1000),以空格分隔。
输出描述:
输出一个数,表示最少需要的转换次数
输入例子:
4
1 1 1 3
输出例子:
2
import java.util.Scanner; public class Main { public static void main(String[] arg) { Scanner scan = new Scanner(System.in); while (scan.hasNext()) { int n = scan.nextInt(); int[] arr = new int[n]; for (int i = 0; i < n; i++) { arr[i] = scan.nextInt(); } System.out.println(solve(arr,n)); } scan.close(); } private static int solve(int[] arr, int n) { int left = 0; int right = n - 1; int ans = 0; while (left < right) { if (arr[left] < arr[right]) { arr[left + 1] += arr[left]; ++left; ++ans; }else if (arr[left] > arr[right]){ arr[right - 1] += arr[right]; --right; ++ans; }else { ++left; --right; } } return ans; } }