大整数的操作—阶乘,加法,Java开发快速上手

2

3

样例输出 [Copy](javascript:CopyToClipboard($(’#sampleoutput’).text()))

1

2

6

  • 这道题可以用C++来写

思路很简单,就是利用乘法运算中的竖式运算

这个题暴力是肯定不行,算到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

BigInteger


​ 如果在操作的时候一个整型数据已经超过了整数的最大类型长度long的话,则此数据就无法装入,所以,此时要使用BigInteger类进行操作。

img

​ 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());

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

总结

总体来说,如果你想转行从事程序员的工作,Java开发一定可以作为你的第一选择。但是不管你选择什么编程语言,提升自己的硬件实力才是拿高薪的唯一手段。

如果你以这份学习路线来学习,你会有一个比较系统化的知识网络,也不至于把知识学习得很零散。我个人是完全不建议刚开始就看《Java编程思想》、《Java核心技术》这些书籍,看完你肯定会放弃学习。建议可以看一些视频来学习,当自己能上手再买这些书看又是非常有收获的事了。


、实战项目、讲解视频,并且后续会持续更新**

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-IwZZ3fOD-1711851928285)]

总结

总体来说,如果你想转行从事程序员的工作,Java开发一定可以作为你的第一选择。但是不管你选择什么编程语言,提升自己的硬件实力才是拿高薪的唯一手段。

如果你以这份学习路线来学习,你会有一个比较系统化的知识网络,也不至于把知识学习得很零散。我个人是完全不建议刚开始就看《Java编程思想》、《Java核心技术》这些书籍,看完你肯定会放弃学习。建议可以看一些视频来学习,当自己能上手再买这些书看又是非常有收获的事了。

[外链图片转存中…(img-B9lrOn1J-1711851928285)]

  • 17
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值