大整数的计算问题

大整数的计算问题

在c语言中,对于整数的计算,一般是使用int定义一个变量,然后再对其进行计算。很显然,这是存在问题的。因为int能够表达的整数是有范围的,它只能表达-2147483648到±2147483648之前的数。那如果要计算比这个范围还要大的数怎么办呢?
有人可能会说,int不行,那不是还有long int呢吗,再不行还有long long int啊。可是就算是long long int同样存在最大的表示范围。当我们遇到特别大的数,动不动就是几十位的加减乘除时,使用用int变量完全不能满足我们的需求,比如我就碰到过这样一道题:
?
洛谷p1009 阶乘之和

这是一道很简单的题目,要求计算出1的阶乘一直加到n的阶乘,但是它有一个特点就是给出的数据中有非常大的数。

我的代码本来是这样的:

#include<stdio.h>
int main()
{
	int n;
	int i,a=1,s=0;
	scanf("%d",&n);
	for(i=1;i<=n;i++){
		a*=i;
		s+=a;
	}
	printf("%d",s);
	return 0;
}

浅显易懂,输入n的值然后计算阶乘之和,但是提交的时候出现了问题。
在这里插入图片描述
WA?为什么?查询输入数据后发现,原来是计算的结果超出了int的范围。那干脆大一点,用long long试试?在这里插入图片描述
还是不对。long long也不行,那怎么办呢?

经过简单的思考以后,我想到:不能直接定义一个超大的变量,那就把它拆分成一位一位不就好了!这样的话就定义一个字符串,去一位一位的输出数据。

输出的问题解决了,但是紧接着就是新的问题:如何进行运算呢?整形的话直接使用运算符就好了,字符串呢?一位一位去运算吗?是不是还需要考虑进位的问题。

经过了短暂的构思和试验之后,我还是想出了解决的办法,具体的实现是这样的:

#include<stdio.h>
int main()
{
	int n;
	int a[1000],b;
	int c[1000]={0},d;
	int i,j,k,l=0;
	int x,y=1;
	scanf("%d",&n);
	a[0]=1;
	for(i=1;i<=n;i++){
		for(j=1,x=0;j<=y;j++){
			b=a[j-1]*i+x;
			a[j-1]=b%10;
			x=b/10;
			}
			while(x){
				a[++y-1]=x%10;
				x/=10;
			}
			for(k=0;k<y;k++){
				d=c[k]+a[k]+l;
				c[k]=d%10;
				l=d/10;
			}
	}
	for(i=y;i>=1;i--)
	printf("%d",c[i-1]);
	return 0;
}

首先还是定义一个int变量n,用来输入需要计算的阶乘值。字符串数组a用来记录阶乘每一位的数,对a进行运算得出每一轮的阶乘值。然后将a的值依次记录进字符串c中,在用一个循环输出字符串c,这样就大功告成啦!

提交试试
在这里插入图片描述
成功!

总结

当要计算一个特别大的数的时候,可以定义一个字符串数组,将大数的每一位依次填入字符串数组中,再对字符串数组的每个元素进行计算,最后输出。通过这种方法,就算是计算几百位上千位的数读不成问题!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要计算两个大整数的最小公倍数,我们需要先分别计算它们的所有质因数的最高次幂,然后将这些最高次幂相乘即可得到它们的最小公倍数。 举个例子,我们要计算 12 和 18 的最小公倍数。首先将它们分解质因数: 12 = 2^2 × 3 18 = 2 × 3^2 然后分别找出它们各自的所有质因数的最高次幂: 2^2 × 3^1 2^1 × 3^2 最后将这些最高次幂相乘得到它们的最小公倍数: 2^2 × 3^2 = 36 所以,12 和 18 的最小公倍数为 36。 ### 回答2: BigInteger类是Java提供的一个用来处理大整数的工具类,可以用来进行大整数计算。要计算两个大整数的最小公倍数,可以按照以下步骤进行: 1. 首先,使用BigInteger的gcd方法(最大公约数)来计算两个大整数的最大公约数。假设两个大整数分别为num1和num2,则可以使用`BigInteger gcd = num1.gcd(num2);`来计算它们的最大公约数。 2. 然后,使用BigInteger的multiply方法(乘法)来计算最小公倍数。由于最小公倍数等于两个数的乘积除以它们的最大公约数,因此可以使用`BigInteger lcm = num1.multiply(num2).divide(gcd);`来计算最小公倍数。 3. 最后,使用lcm.toString()方法将最小公倍数转换为字符串进行输出。 例如,假设我们要计算两个大整数1000000000000000000000000000000000000000和2000000000000000000000000000000000000000的最小公倍数。可以使用以下代码进行计算: ```java import java.math.BigInteger; public class Main { public static void main(String[] args) { BigInteger num1 = new BigInteger("1000000000000000000000000000000000000000"); BigInteger num2 = new BigInteger("2000000000000000000000000000000000000000"); BigInteger gcd = num1.gcd(num2); BigInteger lcm = num1.multiply(num2).divide(gcd); System.out.println("最小公倍数为:" + lcm.toString()); } } ``` 运行以上代码,输出结果为最小公倍数为:2000000000000000000000000000000000000000。 ### 回答3: BigInteger是Java中提供的一个用于进行大整数计算的类。在使用BigInteger进行最小公倍数的计算时,可以采用以下的思路: 首先,我们需要找到两个正整数的最大公约数,然后利用最大公约数来求得最小公倍数。 可以使用BigInteger类中的gcd()方法来求解最大公约数。gcd()方法用于返回当前BigInteger对象与参数BigInteger对象的最大公约数。 接下来,我们可以得到最小公倍数的公式,即两个数的乘积除以它们的最大公约数。可以使用BigInteger类中的multiply()方法和divide()方法来进行计算。 下面是一个使用BigInteger计算最小公倍数的示例代码: ```java import java.math.BigInteger; public class LeastCommonMultiple { public static void main(String[] args) { BigInteger num1 = new BigInteger("1234567890"); BigInteger num2 = new BigInteger("987654321"); // 计算最大公约数 BigInteger gcd = num1.gcd(num2); // 计算最小公倍数 BigInteger lcm = num1.multiply(num2).divide(gcd); System.out.println("最小公倍数为:" + lcm); } } ``` 在上述示例中,我们使用了两个BigInteger对象分别表示需要计算最小公倍数的两个大整数。通过调用gcd()方法求得最大公约数,然后通过multiply()方法和divide()方法计算得到最小公倍数。最后,使用System.out.println()方法将结果输出。 这样,我们就使用BigInteger类成功计算出了两个大整数的最小公倍数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值