C/C++之高精度大数问题

问题一高精度加法

问题描述
  在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263。要想计算更加规模的数,就要用软件来扩展了,比如用数组或字符串来模拟更多规模的数及共运算。
  现在输入两个整数,请输出它们的和。
输入格式
  两行,每行一个整数,每个整数不超过1000位
输出格式
  一行,两个整数的和。
样例输入
15464315464465465
482321654151
样例输出
15464797786119616
数据规模和约定
  每个整数不超过1000位

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std; 
char num1[10001];
char num2[10001];
int main()
{
	int jin=0,i;
	scanf("%s%s",num1,num2);
	int len1=strlen(num1),len2=strlen(num2);
	reverse(num1,num1+strlen(num1));
	reverse(num2,num2+strlen(num2));
	for(i=0;i<len1&&i<len2;i++)
	{
		jin=(num1[i]-'0')+(num2[i]-'0')+jin;
		num1[i]=jin%10+'0';
		jin/=10;
	}
	if(num1[i]=='\0')
	{
		while(i<len2)
		{
			jin=(num2[i]-'0')+jin;
			num1[i]=jin%10+'0';
			jin/=10;
			i++;
		}
	}
	else
	{
		while(i<len1)
		{
			jin=(num1[i]-'0')+jin;
			num1[i]=jin%10+'0';
			jin/=10;
			i++;
		}
	}
	while(jin!=0)
	{
		num1[i]=jin%10+'0';
		jin/=10;
		i++;
	}
	num1[i]='\0';
	for(int j=strlen(num1)-1;j>=0;j--)
		cout<<num1[j];
	return 0;
}

第二题高精度乘法

问题描述
计算机真是最傻的东西;他都不能计算大于10^65-1的ab,请你帮这个“最傻”的东西过关,否则它就真的只认识1和0了。
输入格式
共两行;
第一行输入一个整数a;
第一行输入一个整数b。
输出格式
  共一行,一个表示a
b的整数。
样例输入
2147483647
2147483647
样例输出
4611686014132420609
数据规模和约定
  1065-1<a,b<10201-1

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std; 
char num1[10001];
char num2[10001];
char num3[20002]; 
int main()
{
	memset(num3,'0',sizeof(num3));
	int jin=0,i,num=-1,k;
	scanf("%s%s",num1,num2);
	int len1=strlen(num1),len2=strlen(num2);
	for(int i=len1-1;i>=0;i--)
	{
		num++;
		k=num;
		for(int j=len2-1;j>=0;j--)
		{
			jin=jin+(num1[i]-'0')*(num2[j]-'0')+(num3[k]-'0');
			num3[k++]=jin%10+'0';
			jin/=10;
		 } 
		 while(jin!=0)
		 {
		 	jin=(num3[k]-'0')+jin;
		 	num3[k]=jin%10+'0';
		 	jin/=10;
		 	k++;
		 }
	}
	for(k--;k>=0;k--)
		cout<<num3[k];
	return 0;
}

emmmmmmmmmmmm
虽然感觉并不是很难,但是还是有些常见的错误比较难避免,我主要遇到的问题是进位问题,因为进位首先要将字符转为数字,然后再将数字转成字符串,尤其是第二题,因为考虑到num3会保存结果,所以一开始就将num3全部置0,结果在处理进位时写成了jin=num3[k]+jin,一运行一大串的数字就直接打印到屏幕是,瞬间就懵逼了,哈哈哈哈哈哈哈。

第三道题

问题描述
  在当今的大数据时代,超大数的高精度计算已经成为众多领域的热门研究之一。现在T校也想在此领域有所造诣已造福于全社会,然而由于时间有限,所以短时间内难以找出大数计算的通用算法,于是学校找到了同学中的“神霸”——你来帮忙,并仅要求你能在数并不算大的时候给出结果。又出于某种特殊需要,也并不要求你给出数的全部结果,而只是要求结果的前10位(注意不是后10位),并考虑到2的幂次的特殊性和典型性,所以要你计算的数均为2的幂次。
输入格式
  一个自然数n。
输出格式
  2的n次幂的前10位。
样例1 输入
  60
样例1 输出
  1152921504
样例2 输入
  60000
样例2 输出
  6305794870
数据规模和约定
  0<=n<=10000000

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std; 
int main()
{
	int n;
	cin>>n;
	double t=1;
	for(int i=0;i<n;i++)
	{
		t=t*2;
		while(t>10000000000)
			t=t/10;
	}
	long long s=t;
	cout<<s;
	return 0;
}

这道题刚开始完全不知道怎么做,哈哈哈哈哈哈哈,刚刚入门,本来想用字符数组或者2进制做,但是看到时间和空间决定放弃了,然后百度了一下,感觉没啥用,主要是逻辑太复杂了,然后想到了double变量,虽然数据规模很大,但是能有double大吗?有,但是double还是能解决,当32位double,有1位2进制表示正负,8位2进制表示阶码,23位2进制表示尾码,double感觉足够解决这个问题,虽然不知道到底完不完全正不正确,但是我做的这道题最终ac了,感谢计算机组成原理老师

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值