高精度加法与高精度乘法模板
本帖最后由 陈尚涵 于 2024-4-5 13:21 编辑水个贴,顺便撒个币,每人3育碧{:10_250:}
自己写的还算标准的模板,供大家食用{:10_256:}
1.原理就是竖式,想想就能明白;
2.NUM_SIZE是最大数字位数;
3.计算前要用memset清空一下,否则就是两个结果相加。
高精度加法:
#include <iostream>
#include <cstring>
using namespace std;
const int NUM_LEN=100;
int a,b,c;
int add(int al,int bl){
int cl=max(al,bl),clm=0;
for(int i=0;i<cl;i++){
c+=a+b;
if(c>=10){
c++;
c-=10;
if(i==cl-1)clm=1;
}
}
return cl+clm;
}
int main(){
char sa,sb;
cin>>sa>>sb;
int sal=strlen(sa),sbl=strlen(sb);
for(int i=0;i<sal;i++)a=sa-'0';
for(int i=0;i<sbl;i++)b=sb-'0';
memset(c,0,sizeof(c));
char sc;
int scl=add(sal,sbl);
for(int i=0;i<scl;i++)sc=c+'0';
cout<<sc;
return 0;
}
高精度乘法:
#include <iostream>
#include <cstring>
using namespace std;
const int NUM_LEN=100;
int a,b,c;
int muitiply(int al,int bl){
int cl=al+bl-1,clm=0;
for(int i=0;i<al;i++){
for(int j=0;j<bl;j++){
c+=a*b;
if(c>=10){
c+=c/10;
c%=10;
if(i==al-1)clm=1;
}
}
}
return cl+clm;
}
int main(){
char sa,sb;
cin>>sa>>sb;
int sal=strlen(sa),sbl=strlen(sb);
for(int i=0;i<sal;i++)a=sa-'0';
for(int i=0;i<sbl;i++)b=sb-'0';
memset(c,0,sizeof(c));
char sc;
int scl=muitiply(sal,sbl);
for(int i=0;i<scl;i++)sc=c+'0';
cout<<sc;
return 0;
} 对于高精度加法和乘法的模板,我可以给你提供一个简单的实现。首先是高精度加法的代码:
#include <iostream>
#include <cstring>
using namespace std;
const int NUM_LEN = 100;
int a, b, c;
void add(int a[], int b[], int c[]) {
int carry = 0;
for (int i = 0; i < NUM_LEN; i++) {
c = a + b + carry;
carry = c / 10;
c %= 10;
}
}
int main() {
char sa, sb;
cin >> sa >> sb;
int la = strlen(sa);
int lb = strlen(sb);
// 将输入的字符数组转换成数字数组
for (int i = 0; i < la; i++) {
a = sa - '0';
}
for (int i = 0; i < lb; i++) {
b = sb - '0';
}
add(a, b, c);
// 输出结果
bool start = false;// 是否开始输出结果
for (int i = NUM_LEN - 1; i >= 0; i--) {
if (c != 0) {
start = true;
}
if (start) {
cout << c;
}
}
if (!start) {
cout << "0";// 特殊情况,结果为0
}
return 0;
}
这个代码中,我们定义了一个数组a、b和c来存储两个加数和它们的和。add函数接受两个加数数组和一个结果数组,将两个数组进行相加,并将结果存入结果数组。最后,我们将结果以倒序的方式输出。
接下来是高精度乘法的代码:
#include <iostream>
#include <cstring>
using namespace std;
const int NUM_LEN = 100;
int a, b, c;
void multiply(int a[], int b[], int c[]) {
for (int i = 0; i < NUM_LEN; i++) {
for (int j = 0; j < NUM_LEN; j++) {
c += a * b;
}
}
for (int i = 0; i < NUM_LEN - 1; i++) {
c += c / 10;
c %= 10;
}
}
int main() {
char sa, sb;
cin >> sa >> sb;
int la = strlen(sa);
int lb = strlen(sb);
// 将输入的字符数组转换成数字数组
for (int i = 0; i < la; i++) {
a = sa - '0';
}
for (int i = 0; i < lb; i++) {
b = sb - '0';
}
multiply(a, b, c);
// 输出结果
bool start = false;// 是否开始输出结果
for (int i = NUM_LEN - 1; i >= 0; i--) {
if (c != 0) {
start = true;
}
if (start) {
cout << c;
}
}
if (!start) {
cout << "0";// 特殊情况,结果为0
}
return 0;
}
这个代码中,我们定义了一个数组a、b和c来存储两个乘数和它们的积。multiply函数使用了双重循环来进行乘法运算,并将结果存入结果数组。最后,我们将结果以倒序的方式输出。
请注意,以上代码只是提供一个简单的实现,可能无法处理溢出和其他异常情况。在实际使用中,还需要根据具体需求进行适当的优化和错误处理。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 {:10_275:} 不错,以后可能用得上 {:5_108:} {:5_106:} 学习一下 hello 猜你想搜:快速傅里叶变换,比 N^2 的暴力乘法快多了。 感谢育碧! 谢谢分享
页:
[1]
2