宁波做网站哪家好,网站建设工作整改报告,彬县网吧,wordpress xiu5.3目录 引言一、高精度加法1.题目描述2.代码实现3.测试 二、高精度减法1.题目描述2.代码实现3.测试 三、高精度乘法1.题目描述2.代码实现3.测试 四、高精度除法1.题目描述2.代码实现3.测试 引言
本文介绍了高精度加法、高精度减法、高精度乘法、高精度除法#xff0c;这个高精度… 目录 引言一、高精度加法1.题目描述2.代码实现3.测试 二、高精度减法1.题目描述2.代码实现3.测试 三、高精度乘法1.题目描述2.代码实现3.测试 四、高精度除法1.题目描述2.代码实现3.测试 引言
本文介绍了高精度加法、高精度减法、高精度乘法、高精度除法这个高精度来说还是有点用的在一些竞赛啥的还是能用得上的当然了这个只针对C来说java或者python本身就有大整数类型没必要搞这个。
一、高精度加法
当然先说一下什么是高精度就是一个很长的数拿long long也存不下的这种虽然long long很大有9.2*10^18那么大可是长度也就19而已所以要是我输入一个长度50或者100的数就没有办法了所以这就是高精度存在的意义然后思想就是拿string来存然后根据一些运算特性每一位每一位的处理然后整合就是最终结果了。
1.题目描述
给定两个正整数不含前导 0计算它们的和。输入格式
共两行每行包含一个整数。输出格式
共一行包含所求的和。数据范围1≤整数长度≤100000输入样例
12
23
输出样例
352.代码实现
说一下思路啊首先是输入的问题因为要加法肯定是从个位加的然后需要进位所以肯定个位是从0号下标开始好因为如果从size-1号下标遍历也行只不过如果牵扯到进位的话那么就得从头插了那就需要特判还要移动整个数组就太费劲了所以选择把个位存到0号下标去。 然后是加法的问题了首先定义一个t代表进位然后从个位开始循环每一位因为不知道A和B谁长所以循环条件这样写然后t也可能最后也有进位所以也加入判断条件了因为最后i可能会超出A或者B的范围所以在循环里还要判断一下才能加然后t % 10存到C中t / 10就完成了一次操作最后要把前导0给去掉最后从后向前输出C就行了。
#include iostream
#include vectorusing namespace std;vectorint add(vectorint A, vectorint B)
{vectorint C;int t 0;for(int i 0; i A.size() || i B.size() || t; i){if(i A.size()) t A[i];if(i B.size()) t B[i];C.push_back(t % 10);t / 10;}return C;
}int main()
{string a, b;cin a b;vectorint A, B;for(int i a.size() - 1; i 0; --i) A.push_back(a[i] - 0);for(int i b.size() - 1; i 0; --i) B.push_back(b[i] - 0);auto C add(A, B);for(int i C.size() - 1; i 0; --i) printf(%d, C[i]);return 0;
}3.测试
可以看出是完全正确的也AC了 二、高精度减法
1.题目描述
给定两个正整数不含前导 0计算它们的差计算结果可能为负数。输入格式
共两行每行包含一个整数。输出格式
共一行包含所求的差。数据范围
1≤整数长度≤105输入样例
32
11
输出样例
212.代码实现
这个减法其实跟加法差不多区别在于如果是负数还是大的减去小的只不过前面要添个’-其余的问题看代码或者注释问题都不太大了
#include iostream
#include vectorusing namespace std;bool cmp(string a, string b) //a b ?
{if(a.size() ! b.size()) return a.size() b.size();for(int i 0; i a.size(); i){if(a[i] ! b[i]) return a[i] b[i];}return true;
}vectorint sub(vectorint a, vectorint b)
{vectorint C;int t 0;for(int i 0; i a.size(); i){t a[i];if(i b.size()) t - b[i]; //因为b是小于a的C.push_back((t 10) % 10); //t可能大于0也可能小于0这样做全包括了if(t 0) t -1;else t 0;}while(C.size() 1 C.back() 0) C.pop_back(); //可能存在前导0return C;
}int main()
{string a, b;cin a b;bool sign cmp(a,b);if(!sign){printf(-);swap(a,b);}vectorint A, B;for(int i a.size() - 1; i 0; --i) A.push_back(a[i] - 0);for(int i b.size() - 1; i 0; --i) B.push_back(b[i] - 0);auto C sub(A,B);for(int i C.size() - 1; i 0; --i) printf(%d, C[i]);return 0;
}3.测试
可以看出都是正确的然后最后也AC了 三、高精度乘法
1.题目描述
给定两个非负整数不含前导 0 A 和 B请你计算 A×B 的值。输入格式共两行第一行包含整数 A第二行包含整数 B。输出格式共一行包含 A×B 的值。数据范围
1≤A的长度≤100000,0≤B≤10000输入样例
2
3
输出样例
62.代码实现
这个高精度乘法正常的算不太一样这是从高精度的每一位算起每一位都乘以这个小整数
#include iostream
#include vectorusing namespace std;vectorint mul(vectorint a, int b)
{vectorint C;int t 0;for(int i 0; i a.size() || t; i){if(i a.size()) t a[i] * b;C.push_back(t % 10);t / 10;}while(C.size() 1 C.back() 0) C.pop_back();return C;
}int main()
{string a;int b;cin a b;vectorint A;for(int i a.size() - 1; i 0; --i) A.push_back(a[i] - 0);auto C mul(A,b);for(int i C.size() - 1; i 0; --i) printf(%d, C[i]);return 0;
}3.测试
可以看出结果都是正确的这道题也AC了
四、高精度除法
1.题目描述
给定两个非负整数不含前导 0 AB请你计算 A/B 的商和余数。输入格式共两行第一行包含整数 A第二行包含整数 B。输出格式共两行第一行输出所求的商第二行输出所求余数。数据范围1≤A的长度≤100000,1≤B≤10000 ,B 一定不为 0输入样例
7
2
输出样例
3
12.代码实现
这里注意一下的是这个除法是从高位算起的但因为正常情况下给出的a个位都是0下标然后输出也因为是个位为0下标因为输入输出的原因所以div就处理的多了一些不过核心还是不变的
#include iostream
#include vector
#include algorithmusing namespace std;vectorint div(vectorint a, int b, int r)
{vectorint C;r 0;for(int i a.size() - 1; i 0; --i){r r * 10 a[i];C.push_back(r / b);r % b;}reverse(C.begin(), C.end());while(C.size() 1 C.back() 0) C.pop_back();return C;
}int main()
{string a;int b;cin a b;vectorint A;for(int i a.size() - 1; i 0; --i) A.push_back(a[i] - 0);int r; //余数auto C div(A, b, r);for(int i C.size() - 1; i 0; --i) printf(%d, C[i]);printf(\n%d, r);return 0;
}3.测试
可以看出来也是没问题的