大整数运算
大整数运算
1.AcWing791.高精度加法12345678910111213//大整数加法vector<int> add(vector<int> &A, vector<int> &B) { vector<int> C; int t = 0;//进位数据 for (int i = 0; i < A.size() || i < B.size(); ++i) { if (i < A.size()) t += A[i]; if (i < B.size()) t += B[i]; C.push_back(t % 10); t /= 10; } if (t) C.push_back(1);//最高位进位 return C;}
2.AcWing792.高精度减法12345678910111213141516171819202122232425262728293031//大整数减法vector<int> sub(vector<int> &A, vector<int> &B) { vector<int> C; int t = 0; for (int i = 0; i < A.size(); ++i) {//A.size() > B.size() 故可以省略简写if条件 t = A[i] - t;//检查本位是否有借位 if (i < B.size()) t -= B[i]; C.push_back((t + 10) % 10); if (t < 0) t = 1;//判断是否需要借位 else t = 0; } while (C.size() > 1 && C.back() == 0) C.pop_back();//最高位前导零处理 return C;}bool cmp(vector<int> ...
二进制求和
二进制求和
原题链接:https://leetcode.cn/problems/add-binary/
给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。
1.参考解答==思路==:大整数加法
1
加一
加一
原题链接:https://leetcode.cn/problems/plus-one/
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数0之外,这个整数不会以零开头。
1.参考解答==思路==:大整数加法
将最后一位加1
如果最后一位在加法操作后等于10,则需要进行进位
如果在下标为0的数字位等于10,则需要将数字的整体位数加1
1
1000-digit Fibonacci number
1000-digit Fibonacci number
The Fibonacci sequence is defined by the recurrence relation:Fn = Fn−1 + Fn−2, where F1 = 1 and F2 = 1.
Hence the first 12 terms will be:
F1 = 1F2 = 1F3 = 2F4 = 3F5 = 5F6 = 8F7 = 13F8 = 21F9 = 34F10 = 55F11 = 89F12 = 144
The 12th term, F12, is the first term to contain three digits.
What is the index of the first term in the Fibonacci sequence to contain 1000 digits?
1.大整数加法将两个数组循环相加——用指针将数组的地址作为函数参数传递到函数中,通过交换二维数组第一个下标交换数组地址
123456789101112131415161718192021222324252627282930313233343536373839404142/*思路:大整数加法 + 循环使用两个变量求fib数列1.将大整数加法封装在一个函数中2.循环使用两个变量(数组)求斐波那契数列项3.当出现某一项大于1000时,输出项数结束循环*/#include<iostream>using namespace std;//1.将大整数加法封装在一个函数中void func(int *n1, int *n2){ //注意:初始的n2可能比n1短,需要首先更新答案的长度 n2[0] = n1[0]; for(int i = 1; i <= n2[0]; ++i){ n2[i] += n1[i]; if(n2[i] > 9){ n2[i + 1] += n2[i] / 10; n2[i] %= ...
Large sum
Large sum
Work out the first ten digits of the sum of the following one-hundred 50-digit numbers.
37107287533902102798797998220837590246510135740250463769376774900097126481248969700780504170182605387432498619952474105947423330951305812372661730962991942213363574161572522430563301811072406154908250230675882075393461711719803104210475137780632466768926167069662363382013637841838368417873436172675728112879812849979408065481931592621691275889832738442742289174325203219235894228767964876702721893184745144573600130643909116721685684458871160315327670386486105843025439939619828917593665686757934951621764571418565606295021572231965867550793241933316490635246274190492910143244581382266334794475817892575867718337217661963751590579239728245598838407582035653253593990084026335689488301894586282278288018119938482628201427819413994056758715117009439035398664372827112653829987240784473053190104293586865155060062958648615320752733719591914205172558297169388870771546649911559348760353292171497005693854 ...
大整数运算
大整数运算
1.大整数加法
整数存储类型
范围
short(2 byte)
- 215 ~ (215 - 1)
int(4 byte)
- 231 ~ (231 - 1)
long long(8 byte)
- 263 ~ (263 - 1)
使用字符串进行数字的输入
将数字拆分存储在数组中,num[0]存储数字长度,num[1]存储个位、num[2]十位、num[3]百位……以此类推==倒序存储==
按照==加法规则==将数组中对应的数字相加后存入结果数组中
对需要进位的数字进行进位
12345678910111213141516171819202122232425262728293031323334353637383940414243#include<iostream>#include<cstring>using namespace std;char s1[1005], s2[1005];//输入的两个数字存储在字符串中int num1[1005], num2[1005];//输入的两个数字转化存储在数组中int sum[1005];//数字相加后的结果存储数组int main(){ //1.使用字符串进行数字的输入 cin >> s1 >> s2; num1[0] = strlen(s1); num2[0] = strlen(s2); //2.将数字拆成一位位数字存储在数组中 for(int i = 0, j = num1[0]; s1[i]; ++i, --j){ num1[j] = s1[i] - '0'; } for(int i = 0, j = num2[0]; s2[i]; ++i, --j){ num2[j] = s2[i] - '0'; } //3.按照加法规则将数组中对应的数字相加后存入结果数组中 sum[0] = max(num1[0], num2[0]); for(int i = 1; i <= ...