• 大整数相加,相减,相乘,大整数与普通整数的相乘,相除


     2)两个大整数相乘:

    可以自行列两个小整数模拟一下,就可以理解代码:

    1. /**
    2. 2)两个大整数相乘
    3. */
    4. #include
    5. #include
    6. #include
    7. using namespace std;
    8. struct bignum
    9. {
    10. int d[1000];
    11. int len;
    12. bignum()
    13. {
    14. memset(d,0,1000);
    15. len=0;
    16. }
    17. };
    18. bignum str_big(string str);
    19. bignum divide(bignum& n,int q,int&r);
    20. void print(bignum n);
    21. bignum big_mult(bignum n,bignum m);
    22. int main()
    23. {
    24. string str1,str2;
    25. cin >> str1 >> str2;
    26. bignum num1=str_big(str1);
    27. bignum num2=str_big(str2);
    28. print(big_mult(num1,num2));
    29. return 0;
    30. }
    31. bignum str_big(string str)
    32. {
    33. bignum num;
    34. int ans=str.size();
    35. for(int i=ans-1;i>=0;--i)
    36. {
    37. num.d[num.len++]=str[i]-'0';
    38. }
    39. return num;
    40. }
    41. void print(bignum n)
    42. {
    43. for(int i=n.len-1;i>=0;--i)
    44. printf("%d",n.d[i]);
    45. }
    46. bignum big_mult(bignum n,bignum m)
    47. {
    48. bignum num;
    49. num.len=m.len+n.len;
    50. printf("%d %d %d\n",n.len,m.len,num.len); //调试一用
    51. int r=0;
    52. for(int i=0;i
    53. {
    54. for(int j=0;j
    55. {
    56. r=r+m.d[i]*n.d[j]+num.d[i+j]; //记得将num.d[i+j]的值加上;
    57. num.d[i+j]=r%10;
    58. r/=10;
    59. if(j==n.len-1&&r!=0) //如果第二位数已经算完了,得将剩余的余数一起存到num中
    60. {
    61. num.d[i+j+1]=r%10;
    62. r=0;
    63. }
    64. }
    65. }
    66. while(num.len>1&&num.d[num.len-1]==0)
    67. --num.len;
    68. return num;
    69. }

     2)大整数相加,相减,大整数与普通整数的相乘,相除

    1. /**
    2. 2)大整数相加,相减,大整数与普通整数的相乘,相除
    3. */
    4. #include
    5. #include
    6. #include
    7. using namespace std;
    8. struct bign
    9. {
    10. int d[1000];
    11. int len;
    12. bign()
    13. {
    14. memset(d,0,sizeof(d));
    15. len=0;
    16. }
    17. };
    18. bign div(bign a,int b,int &r);
    19. bign change(char str[]);
    20. bign add(bign a,bign b);
    21. bign sub(bign a,bign b);
    22. bign mul(bign a,int b);
    23. void print(bign a);
    24. int main()
    25. {
    26. char str1[1000],str2[1000];
    27. int b,r=0;
    28. printf("输入两位大整数和一位正整数:\n");
    29. scanf("%s%s%d",str1,str2,&b);
    30. int mn;
    31. if(strlen(str1)>strlen(str2))
    32. mn=1;
    33. else if(strlen(str1)==strlen(str2))
    34. mn=strcmp(str1,str2);
    35. else mn=-1;
    36. bign a=change(str1);
    37. bign d=change(str2);
    38. bign jia=add(a,d);
    39. bign jian;
    40. bign cheng=mul(a,b);
    41. bign chu=div(a,b,r);
    42. printf("加法:\n");
    43. print(jia);
    44. printf("减法:\n");
    45. if(mn>=0)
    46. {
    47. jian=sub(a,d);
    48. print(jian);
    49. }
    50. else
    51. {
    52. jian=sub(d,a);
    53. printf("-");
    54. print(jian);
    55. }
    56. printf("乘法:\n");
    57. print(cheng);
    58. printf("除法:\n");
    59. print(chu);
    60. printf("余数:\n%d\n",r);
    61. cout << "Hello world!" << endl;
    62. return 0;
    63. }
    64. bign change(char str[])
    65. {
    66. bign b;
    67. b.len=strlen(str);
    68. for(int i=0;i
    69. {
    70. b.d[i]=str[b.len-i-1]-'0';
    71. }
    72. return b;
    73. }
    74. bign div(bign a,int b,int &r)
    75. {
    76. bign c;
    77. c.len=a.len;
    78. for(int i=a.len-1;i>=0;i--)
    79. {
    80. r=r*10+a.d[i];
    81. c.d[i]=r/b;
    82. r%=b;
    83. }
    84. while(c.len-1>=1&&c.d[c.len-1]==0)
    85. c.len--;
    86. return c;
    87. }
    88. bign add(bign a,bign b)
    89. {
    90. bign c;
    91. int ans=0;
    92. for(int i=0;i
    93. {
    94. ans=ans+a.d[i]+b.d[i];
    95. c.d[c.len++]=ans%10;
    96. ans/=10;
    97. }
    98. if(ans!=0)
    99. c.d[c.len++]=ans;
    100. return c;
    101. }
    102. bign sub(bign a,bign b)
    103. {
    104. bign c;
    105. for(int i=0;i
    106. {
    107. if(a.d[i]
    108. {
    109. a.d[i+1]--;
    110. a.d[i]+=10;
    111. }
    112. c.d[c.len++]=a.d[i]-b.d[i];
    113. }
    114. while(c.len-1>=1&&c.d[c.len-1]==0)
    115. c.len--;
    116. return c;
    117. }
    118. bign mul(bign a,int b)
    119. {
    120. bign c;
    121. int ans=0;
    122. for(int i=0;i
    123. {
    124. ans=ans+a.d[i]*b;
    125. c.d[c.len++]=ans%10;
    126. ans/=10;
    127. }
    128. while(ans!=0)
    129. {
    130. c.d[c.len++]=ans%10;
    131. ans/=10;
    132. }
    133. return c;
    134. }
    135. void print(bign a)
    136. {
    137. for(int i=a.len-1;i>=0;i--)
    138. printf("%d",a.d[i]);
    139. printf("\n");
    140. }

    下面各自给出一个题目:当然,没有用上面的函数了,上面的函数实在《算法笔记》上学的,下面是在报 Acwing 的课程学的;思想都是一样的:

    791. 高精度加法

    给定两个正整数(不含前导 0

    ),计算它们的和。

    输入格式

    共两行,每行包含一个整数。

    输出格式

    共一行,包含所求的和。

    数据范围

    1≤整数长度≤100000

    输入样例:

    1. 12
    2. 23

    输出样例:

    35
    

     

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. vector<int> add(vector<int> &A,vector<int> &B)
    7. {
    8. vector<int> C;
    9. int r=0;
    10. for(size_t i=0;isize()||isize();++i)
    11. {
    12. if(isize()) r+=A[i];
    13. if(isize()) r+=B[i];
    14. C.push_back(r%10);
    15. r/=10;
    16. }
    17. if(r)
    18. C.push_back(r);
    19. return C;
    20. }
    21. int main()
    22. {
    23. string a,b;
    24. cin >> a >> b;
    25. vector<int> A,B;
    26. for(int i=a.size()-1;i>=0;--i)
    27. A.push_back(a[i]-'0');
    28. for(int i=b.size()-1;i>=0;--i)
    29. B.push_back(b[i]-'0');
    30. vector<int> C=add(A,B);
    31. for(int i=C.size()-1;i>=0;--i)
    32. printf("%d",C[i]);
    33. return 0;
    34. }

    792. 高精度减法

    给定两个正整数(不含前导 0

    ),计算它们的差,计算结果可能为负数。

    输入格式

    共两行,每行包含一个整数。

    输出格式

    共一行,包含所求的差。

    数据范围

    1≤整数长度≤105

    输入样例:

    1. 32
    2. 11

    输出样例:

    21
    
    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. bool Cmp(string &a,string &b)
    7. {
    8. if(a.size()!=b.size())
    9. return a.size() > b.size();
    10. else
    11. for(int i=0;isize();++i)
    12. if(a[i]!=b[i])
    13. return a[i] > b[i];
    14. return true;
    15. }
    16. vector<int> sub(vector<int> &A,vector<int> &B)
    17. {
    18. vector<int> C;
    19. int r=0;
    20. for(int i=0;isize();++i)
    21. {
    22. r+=A[i];
    23. if(isize()) r-=B[i];
    24. C.push_back((r+10)%10);
    25. if(r<0)
    26. r=-1;
    27. else
    28. r=0;
    29. }
    30. while(C.size()>1&&C.back()==0)
    31. C.pop_back();
    32. return C;
    33. }
    34. int main()
    35. {
    36. string a,b;
    37. cin >> a >> b;
    38. vector<int> A,B;
    39. for(int i=a.size()-1;i>=0;--i)
    40. A.push_back(a[i]-'0');
    41. for(int i=b.size()-1;i>=0;--i)
    42. B.push_back(b[i]-'0');
    43. vector<int> C;
    44. if(Cmp(a,b))
    45. C=sub(A,B);
    46. else
    47. {
    48. C=sub(B,A);
    49. printf("-");
    50. }
    51. for(int i=C.size()-1;i>=0;--i)
    52. printf("%d",C[i]);
    53. return 0;
    54. }

    793. 高精度乘法

    给定两个非负整数(不含前导 0

    ) A 和 B,请你计算 A×B

    的值。

    输入格式

    共两行,第一行包含整数 A

    ,第二行包含整数 B

    输出格式

    共一行,包含 A×B

    的值。

    数据范围

    1≤A的长度≤100000

    ,
    0≤B≤10000

    输入样例:

    1. 2
    2. 3

    输出样例:

    6
    

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. vector<int> mul(vector<int> &A,int b)
    7. {
    8. vector<int> C;
    9. int r=0;
    10. for(int i=0;isize();++i)
    11. {
    12. r+=A[i]*b;
    13. C.push_back(r%10);
    14. r/=10;
    15. }
    16. while(r)
    17. {
    18. C.push_back(r%10);
    19. r/=10;
    20. }
    21. while(C.size()>1&&C.back()==0)
    22. C.pop_back();
    23. return C;
    24. }
    25. int main()
    26. {
    27. string a;
    28. int b;
    29. cin >> a >> b;
    30. vector<int> A;
    31. for(int i=a.size()-1;i>=0;--i)
    32. A.push_back(a[i]-'0');
    33. vector<int> C=mul(A,b);
    34. for(int i=C.size()-1;i>=0;--i)
    35. printf("%d",C[i]);
    36. return 0;
    37. }

    794. 高精度除法

    给定两个非负整数(不含前导 0

    ) A,B,请你计算 A/B

    的商和余数。

    输入格式

    共两行,第一行包含整数 A

    ,第二行包含整数 B

    输出格式

    共两行,第一行输出所求的商,第二行输出所求余数。

    数据范围

    1≤A的长度≤100000

    ,
    1≤B≤10000,
    B 一定不为 0

    输入样例:

    1. 7
    2. 2

    输出样例:

    1. 3
    2. 1
    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. using namespace std;
    7. vector<int> div(vector<int> &A,int b,int &r)
    8. {
    9. vector<int> C;
    10. for(int i=A.size()-1;i>=0;--i)
    11. {
    12. r=r*10+A[i];
    13. C.push_back(r/b);
    14. r%=b;
    15. }
    16. reverse(C.begin(),C.end());
    17. while(C.size()>1&&C.back()==0)
    18. C.pop_back();
    19. return C;
    20. }
    21. int main()
    22. {
    23. string a;
    24. int b;
    25. cin >> a >> b;
    26. vector<int> A;
    27. for(int i=a.size()-1;i>=0;--i)
    28. A.push_back(a[i]-'0');
    29. int r=0;
    30. vector<int> C=div(A,b,r);
    31. for(int i=C.size()-1;i>=0;--i)
    32. printf("%d",C[i]);
    33. printf("\n%d\n",r);
    34. return 0;
    35. }

  • 相关阅读:
    弹性数据库连接池探活策略调研(三)——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