问题一高精度加法
问题描述
在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。
输出格式
共一行,一个表示ab的整数。
样例输入
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了,感谢计算机组成原理老师