为什么c语言会入门到入土,大整数从入门到入土

大整数(高精)

声明,这是一篇从入门到入土的大整数讲解,可能有那么一点小长,内容涵盖大整数加法,减法和乘法,但由于水平有限,还是有不足之处希望评论提出。如果你是一个萌新,相信我,我会写得非常详细,你一定能看懂,同时也要相信自己能看懂。

这篇讲解大概思路是按照我的进步,一点一点写出来的。

另外,这篇大整数讲解部分的所有数组下标都是从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',就可以得到相应数字了

*/

为什么是倒序,一是因为这样模拟时进位和借位方便,二是我们在大整数运算时都是先从最低位考虑,倒序可以直接从最后一位开始处理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值