网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
这个题暴力是肯定不行,算到20多就炸了,这个题给的范围到10000
所以,这个题运用到大数运算
我们用数组a来存储数据的每一位,用digit来表示当前的位数。 并初始化digit=1,a[0]=1;
n=2 a[0]=2
n=3 a[0]=6
n=4 a[0]=4 a[1]=2
n=5 a[0]=0 a[1]=2 a[2]=1
…
看到以上的数据肯定能明白 关键是怎么实现的呢
存储的数据是从个位开始存储的,只需要temp=a[0]*i+up (i的取值范围 1-n,up模拟的是的一个进位运算,例如n=5的时候 a[0]=(4 * 5)%10=0, 个位确定为0,a[1]=(2 * 5+(20/10))%10=2,十位确定为2 这个时候n=4的时候p=2,已经计算完了,这个时候up=12/10=1!=0 还需要再一次往前进位 a[p]=%10=1 p++ 位数为3 结束)
这里插入一个视频:
【算法教程】大数加法与大数阶乘
- AC代码如下:
#include<bits/stdc++.h>
using namespace std;
const int Maxn=10e5;
int a[Maxn]; // 用数组a来存储每一位
int main()
{
int n;
while(cin>>n)
{
memset(a,0,sizeof(a)); // 先初始化为0;
a[0]=1; // 先将a[0]赋值为1;
int p=1; // p代表数组a[p]还未开始储存数字
for(int i=2;i<=n;i++) // 模拟n的阶乘
{
int up=0,temp=0; // temp临时储存a[j]*i的值,up代表进位值
for (int j=0;j<p;j++) // 将 a[j]与i相乘,此处为一个遍历;
{
temp=a[j]*i+up;
up=temp/10;
a[j]=temp%10;
}
while(up>0) // 如果up>0;说明往a[p]里面存值了
{
a[p++]=up%10;
up/=10;
}
}
for(int i=p-1;i>=0;i–) // 数组的逆序输出;
cout<<a[i];
cout<<endl;
}
return 0;
}
-
下面是java的操作:
-
AC源码:(ps:这是一段比较简单的代码就不多注释了)
package javaLearn;
import java.util.*;
import java.math.*;
public class bigInter {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
while (cin.hasNext())
{
int n=cin.nextInt();
BigInteger sum=new BigInteger(“1”);
BigInteger flag=new BigInteger(“1”);
for(int i=0;i<n;i++)
{
sum=sum.multiply(flag);
flag=flag.add(new BigInteger(“1”));
}
System.out.println(sum);
}
}
}
下面着重解释一下:
java中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类,至于两个类的对象能表示最大范围不清楚,理论上能够表示无线大的数,只要计算机内存足够大。这两个类都在java.math.*包中,因此每次必须在开头处引用该包。
Ⅰ基本函数:
1.valueOf(parament); 将参数转换为制定的类型
比如 int a=3;
BigInteger b=BigInteger.valueOf(a);
则b=3;
String s=”12345”;
BigInteger c=BigInteger.valueOf(s);
则c=12345;
2.add(); 大整数相加
BigInteger a=new BigInteger(“23”);
BigInteger b=new BigInteger(“34”);
a.add(b);
3.subtract(); 相减
4.multiply(); 相乘
5.divide(); 相除取整
6.remainder(); 取余
7.pow(); a.pow(b)=a^b
如果在操作的时候一个整型数据已经超过了整数的最大类型长度long的话,则此数据就无法装入,所以,此时要使用BigInteger类进行操作。
BigInteger是在java.math包中。
- 样例代码:
//实例化一个大数字
BigInteger num1 = new BigInteger(“4”);
//将普通的数值转换为大数值
BigInteger num2 = BigInteger.valueOf(3);
//取该大数字加2的操作
System.out.println(“加法操作:”+ num1.add(num2));
//取该大数字减2的操作
System.out.println(“减法操作:”+ num1.subtract(num2));
//取该大数字乘以2的操作
System.out.println(“乘法操作:”+ num1.multiply(num2));
//取该大数字除以2的操作
System.out.println(“除法操作:”+ num1.divide(num2));
//求余
System.out.println(“取余:”+ num1.remainder(num2));
System.out.println(“取余:”+ num1.mod(num2));
//取该大数字的2次方
System.out.println(“做2次方操作:”+ num1.pow(2));
//取该大数字的相反数
System.out.println(“取相反数操作:”+ num1.negate());
//取最大公约数
System.out.println(“取最大公约数:”+ num1.gcd(num2));
//取绝对值
System.out.println(“取绝对值:”+ num1.abs());
//判断相等
System.out.println(“判断相等:”+ num1.equals(num2));
//比较大小
System.out.println(“比较大小:”+ num1.compareTo(num2));
//取较大值
System.out.println(“取较大值:”+ num1.max(num2));
使用此类可以完成大的小数操作,而且也可以使用此类进行精确的四舍五入,这一点在开发中经常使用。
对于不需要任何准确计算精度的程序可以直接使用float或double完成,但是如果需要精确计算结果,则必须使用BigDecimal类。
- 用法示例:
//实例化一个大数字
BigDecimal num1 = new BigDecimal(“4.10”);
//将普通的数值转换为大数值
BigDecimal num2 = BigDecimal.valueOf(3.9);
//取该大数字加操作
System.out.println(“加法操作:”+ num1.add(num2));
//取该大数字减操作
System.out.println(“减法操作:”+ num1.subtract(num2));
//取该大数字乘操作
System.out.println(“乘法操作:”+ num1.multiply(num2));
//取该大数字除操作
System.out.println(“除法操作:”+ num1.divide(num2, 4, RoundingMode.HALF_UP));
//取该大数字的相反数
System.out.println(“取相反数操作:”+ num1.negate());
//取绝对值
System.out.println(“取绝对值:”+ num1.abs());
//判断相等, 当且仅当两个BigDecimal对象数值和精度scale均相等时才返回true
System.out.println(“判断相等:”+ num1.equals(BigDecimal.valueOf(41, 1)));
System.out.println(“判断相等:”+ num1.equals(BigDecimal.valueOf(410, 2)));
//比较大小,仅比较两个BigDecimal对象数值是否相等,忽略精度
System.out.println(“比较大小:”+ num1.compareTo(BigDecimal.valueOf(41, 1)));
System.out.println(“比较大小:”+ num1.compareTo(BigDecimal.valueOf(410, 2)));
//取较大值
System.out.println(“取较大值:”+ num1.max(num2));
我以大整数为例,用代码示例一次:
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
eTo(BigDecimal.valueOf(410, 2)));
//取较大值
System.out.println(“取较大值:”+ num1.max(num2));
我以大整数为例,用代码示例一次:
[外链图片转存中…(img-Chy6KoTT-1715877784042)]
[外链图片转存中…(img-jURe6SK4-1715877784043)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新