「蓝桥杯」
学习目标:
学习内容:
- [ 1] 一 高精度数据处理
- [ 2] 一 不用系统自带的高精度类完成阶乘
高精度阶乘:
1、代码如下:
import java.util.Scanner;public class LargeIntegerFactorial { public static void main(String[] args) { Scanner sc = new Scanner(System.in); long[] ans = new long[10001000]; long n = sc.nextLong(); ans[0] = 1; int l = 0; long num = 0; for(int i = 1; i<=n;++i) { num = 0; for(int j = 0; j <= l; j++) { num = num + ans[j] * i; ans[j] = num % 10; num /= 10; } while(num != 0) { ans[++l] =num % 10; num /= 10; } } for(int i = l; i >= 0; --i) { System.out.print(ans[i]); } return; }}
2、代码解析如下:
我们接下来把n设置为4,进行代码的实例演示以及解析{long[] ans = new long[10001000];//定义答案数组n = 4;//设置指定数字为4ans[0] = 1;//将答案数组的第一位设置为1 int l = 0;//定义变量l,用来记录n!的数字有多少位 long num = 0;//定义变量num for(int i = 1; i<=n;++i)//核心代码,将在下边进行实例解析 { num = 0; for(int j = 0; j <= l; j++) { num = num + ans[j] * i; ans[j] = num % 10; num /= 10; } while(num != 0) { ans[++l] =num % 10; num /= 10; } }
{
当i == 1时,j == 0, j <= l (0 <= 0), num = 0;num = num + ans[0] * i = 0 + 1 * 1 = 1;ans[0] = num % 10 = 1 % 10 = 1;num = num / 10 = 1 / 10 = 0;
当i == 2时,j == 0,j <= l (0 <= 0),num = 0; num = num + ans[0] * i = 0 + 1 * 2 = 2; ans[0] = num % 10 = 2 % 10 = 2; num = num / 10 = 2 / 10 = 0;
当i == 3时,j == 0,j <= l (0 <= 0),num = 0; num = num + ans[0] * i = 0 + 2 * 3 = 6; ans[0] = num % 10 = 6 % 10 = 6; num = num / 10 = 6 / 10 = 0;
当i == 4时,j == 0,j <= l (0 <= 0),num = 0; num = num + ans[0] * i = 0 + 6 * 4 = 24; ans[0] = num % 10 = 24 % 10 = 4; num = num / 10 = 24 / 10 = 2; 进入while循环, num = 2 != 0; ans[++l] = num % 10 = 2 % 10 = 2;(此时l == 1); ans[1] = 2; num = num / 10 = 2 / 10 = 0;
当i == 5时,j == 0,j <= l (0 <= 1),num = 0; num = num + ans[0] * i = 0 + 4 * 5 = 20; ans[0] = num % 10 = 20 % 10 = 0; num = num / 10 = 2; 当i == 5时,j == 1,j <= l (1 <= 1),num = 2; num = num + ans[1] * i = 2 + 2 * 5 = 12; ans[1] = num % 10 = 12 % 10 = 2; num = num / 10 = 12 / 10 = 1; 进入while循环, num = 1 != 0; ans[++l] = num % 10 = 1 % 10 = 1;(此时l == 2); ans[2] = 1; num = num / 10 = 0; 结束。 }
}
100的阶乘的正约数个数
解题思路如下:
首先将100的阶乘求出来,然后进行质因数分解,也就是每次除以质数,在判断该质数用了几次。然后套用公式:n=(p₁^ a₁) * (p₂^ a₂) * (p₃^ a₃)* (p₄ ^ a₄)…
对于一个大于1正整数n可以分解质因数:n=(p₁^ a₁) * (p₂^ a₂) * (p₃^ a₃)* (p₄ ^ a₄)…
则n的正约数的个数就是(1+a₁)(1+a₂)(1+a₃)(1+a₄)…
假设自然数N等于P的a次乘以q的b次乘以r的C次,P、q、r为不同的质数,则N的约数个数等于(a+1)(b+1)(C+1)。
因数和约数:
约数和因数既有联系,又有区别,这主要表现在以下三个方面。
(1) 约数必须在整除的前提下才存在,而因数是从乘积的角度来提出的。如果数a与数b相乘的积是数c,a与b都是c的因数。
(2) 约数只能对在整数范围内而言,而因数就不限于整数的范围。
例如:6×8=48。既可以说6和8都是48的因数,也可以说6和8都是48的约数。
又如:0.9×8=7.2。虽然可以说0.9和8都是7.2的因数,却不能说0.9和8是7.2的约数。
代码如下:
import java.math.BigInteger;import java.util.ArrayList;import java.util.Scanner;public class ttt { public static void main(String[] args) { Scanner sc = new Scanner(System.in); long[] ans = new long[10001000]; long n = sc.nextLong(); ans[0] = 1; String str = largeIntegerFactorial(n, ans); int t = 2; String mm = ""; int z = 0; ArrayList chuCun = new ArrayList(); BigInteger a = new BigInteger(str); while(1 == 1) { if(zhiShu(t)) { mm = mm + t; if(a.equals(new BigInteger("1"))) { break; } a = a.divide(new BigInteger(mm)); z++; if(!a.mod(new BigInteger(mm)).equals(new BigInteger("0"))) { chuCun.add(z+1);//将调用这个质数的次数赋值给集合 z = 0; t++; } mm = ""; } if(zhiShu(t)==false){ t++; } } BigInteger kk = new BigInteger("1"); String gg = ""; for(int i = 0; i < chuCun.size(); i++) { int sss = (int)chuCun.get(i); gg = gg + sss; kk = kk.multiply(new BigInteger((gg))); gg = ""; } System.out.println(kk); } public static boolean zhiShu(int a) { for(int i=2;i<=a;i++) { if(i==a) { return true; } if(a%i==0) { break; } } return false; } public static String largeIntegerFactorial(long n, long[] ans) { int l = 0; long num = 0; for(int i = 1; i<=n;++i) { num = 0; for(int j = 0; j <= l; j++) { num = num + ans[j] * i; ans[j] = num % 10; num /= 10; } while(num != 0) { ans[++l] =num % 10; num /= 10; } } StringBuilder sb = new StringBuilder(); for(int i = l; i >= 0; --i) { sb.append(ans[i]); } return sb.toString(); }}