2)两个大整数相乘:
可以自行列两个小整数模拟一下,就可以理解代码:
- /**
- 2)两个大整数相乘
- */
-
- #include
- #include
- #include
- using namespace std;
- struct bignum
- {
- int d[1000];
- int len;
- bignum()
- {
- memset(d,0,1000);
- len=0;
- }
- };
- bignum str_big(string str);
- bignum divide(bignum& n,int q,int&r);
- void print(bignum n);
- bignum big_mult(bignum n,bignum m);
- int main()
- {
- string str1,str2;
- cin >> str1 >> str2;
- bignum num1=str_big(str1);
- bignum num2=str_big(str2);
- print(big_mult(num1,num2));
- return 0;
- }
-
- bignum str_big(string str)
- {
- bignum num;
- int ans=str.size();
- for(int i=ans-1;i>=0;--i)
- {
- num.d[num.len++]=str[i]-'0';
- }
- return num;
- }
-
- void print(bignum n)
- {
- for(int i=n.len-1;i>=0;--i)
- printf("%d",n.d[i]);
- }
-
-
- bignum big_mult(bignum n,bignum m)
- {
- bignum num;
- num.len=m.len+n.len;
- printf("%d %d %d\n",n.len,m.len,num.len); //调试一用
- int r=0;
- for(int i=0;i
- {
- for(int j=0;j
- {
- r=r+m.d[i]*n.d[j]+num.d[i+j]; //记得将num.d[i+j]的值加上;
- num.d[i+j]=r%10;
- r/=10;
- if(j==n.len-1&&r!=0) //如果第二位数已经算完了,得将剩余的余数一起存到num中
- {
- num.d[i+j+1]=r%10;
- r=0;
- }
- }
- }
-
- while(num.len>1&&num.d[num.len-1]==0)
- --num.len;
- return num;
- }
2)大整数相加,相减,大整数与普通整数的相乘,相除
- /**
- 2)大整数相加,相减,大整数与普通整数的相乘,相除
- */
-
- #include
- #include
- #include
- using namespace std;
-
- struct bign
- {
- int d[1000];
- int len;
- bign()
- {
- memset(d,0,sizeof(d));
- len=0;
- }
- };
-
- bign div(bign a,int b,int &r);
- bign change(char str[]);
- bign add(bign a,bign b);
- bign sub(bign a,bign b);
- bign mul(bign a,int b);
- void print(bign a);
-
- int main()
- {
- char str1[1000],str2[1000];
- int b,r=0;
- printf("输入两位大整数和一位正整数:\n");
- scanf("%s%s%d",str1,str2,&b);
- int mn;
- if(strlen(str1)>strlen(str2))
- mn=1;
- else if(strlen(str1)==strlen(str2))
- mn=strcmp(str1,str2);
- else mn=-1;
- bign a=change(str1);
- bign d=change(str2);
- bign jia=add(a,d);
- bign jian;
- bign cheng=mul(a,b);
- bign chu=div(a,b,r);
- printf("加法:\n");
- print(jia);
- printf("减法:\n");
- if(mn>=0)
- {
- jian=sub(a,d);
- print(jian);
- }
- else
- {
- jian=sub(d,a);
- printf("-");
- print(jian);
- }
- printf("乘法:\n");
- print(cheng);
- printf("除法:\n");
- print(chu);
- printf("余数:\n%d\n",r);
- cout << "Hello world!" << endl;
- return 0;
- }
-
- bign change(char str[])
- {
- bign b;
- b.len=strlen(str);
- for(int i=0;i
- {
- b.d[i]=str[b.len-i-1]-'0';
- }
- return b;
- }
-
- bign div(bign a,int b,int &r)
- {
- bign c;
- c.len=a.len;
- for(int i=a.len-1;i>=0;i--)
- {
- r=r*10+a.d[i];
- c.d[i]=r/b;
- r%=b;
- }
- while(c.len-1>=1&&c.d[c.len-1]==0)
- c.len--;
- return c;
- }
-
- bign add(bign a,bign b)
- {
- bign c;
- int ans=0;
- for(int i=0;i
- {
- ans=ans+a.d[i]+b.d[i];
- c.d[c.len++]=ans%10;
- ans/=10;
- }
- if(ans!=0)
- c.d[c.len++]=ans;
- return c;
- }
-
- bign sub(bign a,bign b)
- {
- bign c;
- for(int i=0;i
- {
- if(a.d[i]
- {
- a.d[i+1]--;
- a.d[i]+=10;
- }
- c.d[c.len++]=a.d[i]-b.d[i];
- }
-
- while(c.len-1>=1&&c.d[c.len-1]==0)
- c.len--;
- return c;
- }
-
- bign mul(bign a,int b)
- {
- bign c;
- int ans=0;
- for(int i=0;i
- {
- ans=ans+a.d[i]*b;
- c.d[c.len++]=ans%10;
- ans/=10;
- }
- while(ans!=0)
- {
- c.d[c.len++]=ans%10;
- ans/=10;
- }
- return c;
- }
-
- void print(bign a)
- {
- for(int i=a.len-1;i>=0;i--)
- printf("%d",a.d[i]);
- printf("\n");
- }
下面各自给出一个题目:当然,没有用上面的函数了,上面的函数实在《算法笔记》上学的,下面是在报 Acwing 的课程学的;思想都是一样的:
791. 高精度加法
给定两个正整数(不含前导 0
),计算它们的和。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的和。
数据范围
1≤整数长度≤100000
输入样例:
- 12
- 23
输出样例:
35
- #include
- #include
- #include
- #include
-
- using namespace std;
-
- vector<int> add(vector<int> &A,vector<int> &B)
- {
- vector<int> C;
- int r=0;
- for(size_t i=0;i
size()||isize();++i) - {
- if(i
size()) r+=A[i]; - if(i
size()) r+=B[i]; - C.push_back(r%10);
- r/=10;
- }
- if(r)
- C.push_back(r);
- return C;
- }
-
- int main()
- {
- string a,b;
- cin >> a >> b;
- vector<int> 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');
- vector<int> C=add(A,B);
- for(int i=C.size()-1;i>=0;--i)
- printf("%d",C[i]);
- return 0;
- }
792. 高精度减法
给定两个正整数(不含前导 0
),计算它们的差,计算结果可能为负数。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的差。
数据范围
1≤整数长度≤105
输入样例:
- 32
- 11
输出样例:
21
- #include
- #include
- #include
- #include
-
- using namespace std;
-
- bool Cmp(string &a,string &b)
- {
- if(a.size()!=b.size())
- return a.size() > b.size();
- else
- for(int i=0;i
size();++i) - if(a[i]!=b[i])
- return a[i] > b[i];
- return true;
- }
-
- vector<int> sub(vector<int> &A,vector<int> &B)
- {
- vector<int> C;
- int r=0;
- for(int i=0;i
size();++i) - {
- r+=A[i];
- if(i
size()) r-=B[i]; - C.push_back((r+10)%10);
- if(r<0)
- r=-1;
- else
- r=0;
- }
- while(C.size()>1&&C.back()==0)
- C.pop_back();
- return C;
- }
-
- int main()
- {
- string a,b;
- cin >> a >> b;
- vector<int> 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');
- vector<int> C;
- if(Cmp(a,b))
- C=sub(A,B);
- else
- {
- C=sub(B,A);
- printf("-");
- }
- for(int i=C.size()-1;i>=0;--i)
- printf("%d",C[i]);
- return 0;
- }
793. 高精度乘法
给定两个非负整数(不含前导 0
) A 和 B,请你计算 A×B
的值。
输入格式
共两行,第一行包含整数 A
,第二行包含整数 B
。
输出格式
共一行,包含 A×B
的值。
数据范围
1≤A的长度≤100000
,
0≤B≤10000
输入样例:
- 2
- 3
输出样例:
6
- #include
- #include
- #include
- #include
-
- using namespace std;
-
- vector<int> mul(vector<int> &A,int b)
- {
- vector<int> C;
- int r=0;
- for(int i=0;i
size();++i) - {
- r+=A[i]*b;
- C.push_back(r%10);
- r/=10;
- }
- while(r)
- {
- C.push_back(r%10);
- r/=10;
- }
- while(C.size()>1&&C.back()==0)
- C.pop_back();
- return C;
- }
-
- int main()
- {
- string a;
- int b;
- cin >> a >> b;
- vector<int> A;
- for(int i=a.size()-1;i>=0;--i)
- A.push_back(a[i]-'0');
- vector<int> C=mul(A,b);
- for(int i=C.size()-1;i>=0;--i)
- printf("%d",C[i]);
- return 0;
- }
794. 高精度除法
给定两个非负整数(不含前导 0
) A,B,请你计算 A/B
的商和余数。
输入格式
共两行,第一行包含整数 A
,第二行包含整数 B
。
输出格式
共两行,第一行输出所求的商,第二行输出所求余数。
数据范围
1≤A的长度≤100000
,
1≤B≤10000,
B 一定不为 0
输入样例:
- 7
- 2
输出样例:
- 3
- 1
- #include
- #include
- #include
- #include
- #include
-
- using namespace std;
-
- vector<int> div(vector<int> &A,int b,int &r)
- {
- vector<int> C;
- 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;
- vector<int> A;
- for(int i=a.size()-1;i>=0;--i)
- A.push_back(a[i]-'0');
- int r=0;
- vector<int> C=div(A,b,r);
- for(int i=C.size()-1;i>=0;--i)
- printf("%d",C[i]);
- printf("\n%d\n",r);
- return 0;
- }
-
相关阅读:
弹性数据库连接池探活策略调研(三)——DBCP
微服务-kubernetes安装
PIC10F200单片机编程总结-0
Eureka 学习笔记(2)加载eureka-server.properties中的配置
有哪些常见的数据库优化方法
CSS之定位Position
vue3通过ref获取子组件defineExpose的数据和方法
GNU make笔记
java153-字符输出流
[面试直通]操作系统核心之存储系统(上)
-
原文地址:https://blog.csdn.net/qq_51825761/article/details/126107143