第一题 计算阶乘 n!
输入一个正整数 n,输出 n!的值。n<=1000。
1. 定义一个大数组A[]来存大数,数组的一个元素存大数的一位。例如A[0]存个位,A[1]存十位,A[2]存百位,等等。
2. 那么A[]需要定义成多大?也就是说,1000!有多少位?可以自己估计,不过,可以用 windows 自带的计算器能直接算出来,1000! ≈ 4×10^{2567}。代码中定义一个更大的A[10000]。
3. 模拟乘法计算,处理进位:例如356×8。先计算个位的6×8,得48,其中个位的8等于 48%10=8,进位的4等于48/10=4。见我代码中的10\sim 13行,这几行实际上是处理了两个数的乘法,请仔细分析这几行代码。
4. 按3的计算方法,计算n!。第8行的i遍历了1\sim n,计算n!。
5. 最后打印是,从最高位开始打印。先找到最高位,即第一个不等于0的数,然后从高位往最低位打印。
import java.util.Scanner; public class Main { public static void main(String[] args) { int a[] = new int[15000]; for(int i = 1;i<=10000;i++){ a[i] = 0; } int flag = 0; Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); a[1] = 1; for (int i = 1; i <= n; i++) { int plus = 0;//最开始进位为0 for (int j = 1; j <= 10000; j++) { a[j] = a[j] * i + plus; plus = a[j] / 10; a[j] = a[j] % 10; } } for (int i = 10000; i >= 1; i--) { if (a[i] != 0) { flag = i; break; } } for (int i = flag; i >= 1; i--) { System.out.print(a[i]); } } }
同时,java里有可以处理大数的类
import java.math.BigInteger; import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); BigInteger bigInteger = new BigInteger("1"); for(int i = 1;i<=n;i++){ bigInteger=bigInteger.multiply(new BigInteger(String.valueOf(i)));//参数要改成字符串 } System.out.println(bigInteger); } }
第二题 高精度加法(ps idea格式化代码 CRTL+ALT+L)
输入两个整数 a 和 b,输出这两个整数的和。a 和 b 都不超过 100 位。
还是使用BigInteger类来做简单(当然和python还是比不了)
import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); BigInteger bigInteger1 = new BigInteger(scanner.next());//scanner.next是接受字符串的 BigInteger bigInteger2 = new BigInteger(scanner.next()); System.out.println(bigInteger1.add(bigInteger2)); } }
对Java 数组的排序通常用 Arrays.Sort()
第三题 拼数
设有 n 个正整数 a1...an,请将它们联接成一排,相邻数字首尾相接,使得组成的整数最大。
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] nums = new int[n]; for(int i = 0; i < n; i++) nums[i] = sc.nextInt(); String[] s = new String[n]; String ans = ""; for(int i = 0; i < n; i++) s[i] = nums[i] + "";//将数字转换成为字符串 for(int i = 0; i < n - 1; i++) //比较 for(int j = i + 1; j < n; j++) if((s[j] + s[i]).compareTo(s[i] + s[j]) < 0) {//比两个字符串(长度相等)的大小 String temp = s[j]; s[j] = s[i]; s[i] = temp; } for(int i = n - 1; i >= 0; i--)//连字符串 ans += s[i]; System.out.println(ans);//输出 } }