第二章 高精度

高精度加法:

1 怎么表示
2 怎么做加法
image.png

1002 A+B for Polynomials (25 分)

  1. #include <iostream>
  2. using namespace std;
  3. const int N =1010;
  4. double a[N],b[N],c[N];
  5. int main(){
  6. int k;
  7. //读入数组a
  8. cin >> k;
  9. while(k --){
  10. int n;
  11. double v;
  12. cin >> n >> v;
  13. a[n] = v;
  14. }
  15. //读入数组a
  16. cin >> k;
  17. while(k --){
  18. int n;
  19. double v;
  20. cin >> n >> v;
  21. b[n] = v;
  22. }
  23. //求和
  24. for(int i =0 ; i < N; i++){
  25. c[i]=a[i] + b[i];
  26. }
  27. //求不为0项的项数
  28. k =0;
  29. for(int i =0 ; i < N; i ++){
  30. if(c[i]) k ++;
  31. }
  32. //输出
  33. cout << k;
  34. for( int i =N -1; i >= 0; i --){
  35. if(c[i] > 0){
  36. printf(" %d %.1lf", i, c[i]);
  37. }
  38. }
  39. return 0;
  40. }

1009 Product of Polynomials (25 分)

  1. #include <iostream>
  2. using namespace std;
  3. const int N = 1010, M = 2020;
  4. double a[N], b[N];
  5. double c[M];
  6. int main(){
  7. int k;
  8. cin >> k;
  9. while (k --){
  10. int n;
  11. double v;
  12. cin >> n >> v;
  13. a[n] = v;
  14. }
  15. cin >> k;
  16. while (k --){
  17. int n;
  18. double v;
  19. cin >> n >> v;
  20. b[n] = v;
  21. }
  22. for (int i = 0; i < N; i ++){
  23. for (int j = 0; j < N; j ++){
  24. c[i +j] += a[i]* b[j];
  25. }
  26. }
  27. k = 0;
  28. for (int i = 0 ; i < M ; i ++){
  29. if(c[i]) k ++;
  30. }
  31. cout << k;
  32. for (int i = M- 1; i >= 0; i --){
  33. if(c[i]){
  34. printf(" %d %.1lf", i ,c[i]);
  35. }
  36. }
  37. }

1023 Have Fun with Numbers (20 分)

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. using namespace std;
  5. int main(){
  6. string A;
  7. cin >> A;
  8. vector<int> a;
  9. //将A中的元素push到vector里面
  10. for(int i = A.size()-1; i >= 0; i --){
  11. a.push_back(A[i]-'0');
  12. }
  13. vector<int> b;
  14. //高精度加法
  15. int t =0;
  16. for(int i = 0; i < a.size(); i ++){
  17. int s = a[i] + a[i] +t;
  18. b.push_back(s % 10);
  19. t = s /10;
  20. }
  21. if(t) b.push_back(t);//最后的t也要push进去
  22. vector<int> c = b;
  23. //两个队列直接sort后进行比较
  24. sort(a.begin(), a.end());
  25. sort(c.begin(), c.end());
  26. if(a == c ) puts("Yes");
  27. else puts("No");
  28. for(int i = b.size() -1; i >= 0; i --) cout << b[i];
  29. return 0;
  30. }

1024 Palindromic Number (25 分)

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. //check是否是回文数,利用双指针
  5. bool check(vector<int>& num){
  6. for(int i = 0, j=num.size()-1; i <j; i ++, j -- ){
  7. if(num[i] !=num[j]) return false;
  8. }
  9. return true;
  10. }
  11. //高精度加法思想进行相加
  12. vector<int> add(vector<int>& a, vector<int>& b){
  13. vector<int> c;
  14. for(int i =0, t =0 ; i <a.size() || i < b.size() || t; i ++){
  15. int s = t;
  16. if (i < a.size()) s += a[i];
  17. if (i < b.size()) s += b[i];
  18. c.push_back(s % 10);
  19. t = s / 10;
  20. }
  21. return c;
  22. }
  23. int main(){
  24. string n;
  25. int k;
  26. cin >> n >> k;
  27. vector<int> a;
  28. for(int i =n.size()-1; i >= 0; i --){
  29. a.push_back(n[i]-'0');
  30. }
  31. int cnt =0;
  32. if(!check(a)){
  33. while(cnt < k){
  34. //b倒序存a
  35. vector<int> b(a.rbegin(),a.rend());
  36. a = add(a, b);
  37. cnt ++;
  38. if(check(a)) break;
  39. }
  40. }
  41. for(int i =a.size()-1; i >= 0; i --){
  42. cout << a[i];
  43. }
  44. cout << endl << cnt << endl;
  45. return 0;
  46. }

1058 A+B in Hogwarts (20 分)

  1. #include <iostream>
  2. using namespace std;
  3. int main(){
  4. int a, b, c, d, e, f;
  5. scanf("%d.%d.%d %d.%d.%d", &a, &b, &c, &d, &e, &f);
  6. a += d;
  7. b += e;
  8. c += f;
  9. b += c / 29;
  10. c %= 29;
  11. a += b /17;
  12. b %= 17;
  13. printf("%d.%d.%d", a, b, c);
  14. }
#include <iostream>
#include <vector>
using namespace std;

//高精度加法,模板,要背
vector<int> add(vector<int> a, vector<int> b){
    vector<int> c;
    for( int i =0, t =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 = t / 10; 
    }

    return c;

}

bool check(vector<int> num){
    for(int i =0, j = num.size()-1; i < j; i ++, j --){
        if (num[i] != num[j]) return false;
    }
    return true;

}
//输出比较多,统一写一个函数
void print(vector<int> num){
    for(int i = num.size()-1; i >= 0; i --){
        cout << num[i];
    }
}

int main(){
    string n;
    cin >> n;
    vector<int> a;
    for( int i =n.size()-1; i >= 0; i --) a.push_back(n[i]-'0');
    for( int i = 1 ; i <= 10; i ++){
        if(check(a)) break;
        vector<int> b(a.rbegin(), a.rend());
        print(a), cout << " + " , print(b), cout << " = ";
        a = add(a, b);
        print(a),cout << endl;
    }
    if(check(a)) print(a), cout << " is a palindromic number.";
    else puts("Not found in 10 iterations.");
}