大整数(高精)
声明,这是一篇从入门到入土的大整数讲解,可能有那么一点小长,内容涵盖大整数加法,减法和乘法,但由于水平有限,还是有不足之处希望评论提出。如果你是一个萌新,相信我,我会写得非常详细,你一定能看懂,同时也要相信自己能看懂。
这篇讲解大概思路是按照我的进步,一点一点写出来的。
另外,这篇大整数讲解部分的所有数组下标都是从0开始储存,从1储存的代码会在文章的最后贴上,从0储存的代码也会贴上,都是完整的且通过检验的。
刚学完最基础的c语言
好了,刚学完最基础的C语言,现在我们可以通过大整数来练习我们所学习的数组,循环,判断和函数了。
如何读入和储存
大整数,不可能通过一个整数存下来,我们可以用数组。
1.先用字符数组读入,再用整数数组储存
先用字符数组读入
所给出数据格式
(1)如果给出两个数字以一个空格隔开,例如这样
11111111111 11111111111
我们可以使用scanf读入两个整数,储存在两个字符数组中(这两个字符数组取名为s1, s2)
规定整数长度不超过1w,读入代码就可以这样写:
#include
const int maxlen = 1e4 + 10; //1e4是10000科学记数法,具体请自行查资料
char s1[maxlen], s2[maxlen];
int main() {
//下标从0开始
scanf("%s%s", s1, s2);
return 0;
}
(2)如果给出两个数以一个空行隔开,例如这样:
11111111111
11111111111
我们可以用gets或fgets读入并储存在两个字符数组中,这是代码:
#include
const int maxlen = 1e4 + 10; //1e4是10000科学记数法,具体请自行查资料
char s1[maxlen], s2[maxlen];
int main() {
//scanf也可以应付这种情况
scanf("%s%s", s1, s2);
//gets的使用方法是传入地址
gets(s1); gets(s2);
//fgets()有三个参数第一个是需要读入字符数组的地址, 第二个是指定最大读入长度,防止下标越界造成不必要的麻烦,
// 第三个是指定读入文件,因为我们是标准输入输出,所以写stdin就好了,如果不懂就先记着,理解前两个就好了
//另外添加一点,fgets会读入换行,也就是说你会发现读入的字符串的长度比预想中大1,不要吃惊,只是在原字符串末尾多了一个'\n',使用的时候注意一下就好了
fgets(s1, maxlen, stdin);
fgets(s2, maxlen, stdin);
return 0;
}
添加:
如果你学了c++,且了解了string这个类,string的读入方式常见的有两种,上代码:
#include
#include
#include
using namespace std;
string s1, s2;
int main() {
//面对空格和空行都可以的
cin >> s1 >> s2;
//读一整行
//关于getline(),有三个参数,因为我也不是很清楚,所以我不写,强记就好了,
//因为getline()第二个参数是指定最大长度 string长度可以增减,我们就不需要这个参数,传两个就够了
getline(cin, s1);
getline(cin, s2);
return 0;
}
读入问题解决了。
再用字符数组储存
我们用整数数组倒序储存,一个一位
例如"12345678910"储存起来,数组就是这样的{0, 1, 9, 8, 7, 6, 5, 4, 3, 2, 1}
代码是这样的:
#include
#include
const int maxlen = 1e4 + 10;
char s1[maxlen], s2[maxlen];
int a[maxlen], b[maxlen];
int main() {
//读入
scanf("%s%s", s1, s2);
//strlen()取得字符数组的长度,在cstring中数为字符数组的地址
int len1 = strlen(s1), len2 = strlen(s2);
for(int i = 0; i < len1; i++) a[i] = s1[len1 - 1 - i] - '0';
for(int i = 0; i < len2; i++) b[i] = s2[len2 - 1 - i] - '0';
}
/*
关于字符向整数转化转化时为什么要减'0'
在ASCII码中'0'对应的是数字48,如果直接转成整数不减去'0'那么所得数是48,而不是我们所期待的0
对于'1','2','3','4','5','6','7','8','9','0'
它们在ASCII码中的排序是相邻且按照大小排序的的
'0'对应48,那么其他按照对应,分别是49, 50, 51, 52, 53, 54, 55, 56, 57, 58
减去'0',就可以得到相应数字了
*/
为什么是倒序,一是因为这样模拟时进位和借位方便,二是我们在大整数运算时都是先从最低位考虑,倒序可以直接从最后一位开始处理。