【CodeVs】高精度計算

高精度乘法計算
題目:
  給出兩個正整數A和B,計算A*B的值。保證A和B的位數不超過500位。
思路:
  主要記住計算乘法時,豎式計算每一個值對應的座標位置,如數字A和B的第一位相乘,則A的第一位就在第一個位置,第二位就在第二個位置;數字A和數字B的第二位相乘,A的第一位在第二個位置;以此類推;最後再將每個位置上的數字進位到單個數字

#include <iostream>
#include <cstring> 
#include <string>
#include <algorithm>

using namespace std;

int main()
{
	string A, B;
	cin >> A >> B;
	int C[1000];
	memset(C, 0, 1000);
	int len_A = A.size();
	int len_B = B.size();
	for (int i = 0; i < len_A; i++)
		for (int j = 0; j < len_B; j++)
			C[i+j] += (A[i] - '0') * (B[j] - '0');

	for (int i = len_A + len_B - 2; i > 0; i--)
	{
		C[i-1] += C[i] / 10;
		C[i] = C[i] % 10;
	}
	for (int i = 0; i <= len_A + len_B - 2; i++)
		cout << C[i];
	cout << endl;
	
	return 0;
}

高精度加法計算
題目:
  給出兩個正整數A和B,計算A+B的值。保證A和B的位數不超過500位。
思路:
  

/*
作者:時光機
題目:p3116 高精度練習之加法

沒啥區別,就是注意交換之後,長度也要跟着變化,所以應該把求長度的操作放在交換之後

19987787889 98776665
20086564554

但我的答案爲 19:86564554
就是9的後面不是10,是冒號
*/

#include <iostream>
#include <string>
#include <cstring>
#include <stack>

using namespace std;

int main()
{
    string A, B;
    cin >> A >> B;

    if (A.size() < B.size())
        swap(A, B);

    int lenA = A.size();
    int lenB = B.size();
    char cal;
    int more = 0;
    
    for (int i = 0; i < lenA - lenB; i++)
        B = '0' + B;
    
    stack<int> C;
    for (int i = lenA - 1; i >= 0; i--)
    {
        cal = A[i] + (B[i] - '0') + more;
        more = cal > '9' ? 1 : 0;
        if (cal > '9')
        {
            cal -= 10;
        }
        C.push(cal - '0');
    }
    if (more == 1)
        C.push(1);

    //for (int i = 0; i < C.size(); i++)
    while(!C.empty())
    {
        cout << C.top();
        C.pop();
    }

    return 0;
}

int main()
{
    string A, B;
    cin >> A >> B;

    if (A.size() < B.size())
        swap(A, B);
    
    int lenA = A.size();
    int lenB = B.size();
    int more = 0;
    char cal;

    for (int i=lenA-1, j=lenB-1; j >= 0; j--, i--)
    {
        A[i] = A[i] + (B[j] - '0');
        if (A[i] > '9')
        {
            A[i-1]++;
            A[i] -= 10;
        }
    }

    int pos = lenA - lenB - 1;//就是A比B多出來的一截的位置
    while (A[pos] > '9' && pos != 0)
    {
        A[pos-1]++;
        A[pos--] -= 10;
    }
    if (A[0] > '0')//防止對其長度的頭相加,導致溢出
    {
        A[0] -= 10;
        cout << 1;
    }
    cout << A << endl;

    return 0;
}

高精度減法計算
題目:
  給出兩個正整數A和B,計算A-B的值。保證A和B的位數不超過500位。
思路:
  

#include <iostream>
#include <cstring>
#include <string>
#include <stack>

using namespace std;

int main()
{
    string A, B;
    cin >> A >> B;
    if (A.size() < B.size() || (A.size() == B.size() && A < B))
    {
        cout << "-";
        swap(A, B);
    }
    int lenA = A.size();
    int lenB = B.size();
    int less = 0;//是否向上借位
    int cal;//用於計算

    for (int i = 0; i < lenA - lenB; i++)
        B = '0' + B;//填0,使得保持同長度相減
    
    stack<int> C;
    for (int i = lenA - 1; i >= 0; i--)
    {
        cal = A[i] - B[i] - less;//less 爲 0 或 1;
        C.push(cal >= 0 ? cal : cal + 10);
        less = cal >= 0 ? 0 : 1;
    }
    while (C.top() == 0)
        C.pop();
    while (!C.empty())
    {
        cout << C.top();
        C.pop();
    }

    return 0;
}


int main()
{
    string A, B;
    cin >> A >> B;
    if (A.size() < B.size() || (A.size() == B.size() && A < B))
    {
        cout << "-";
        swap(A, B);
    }
    
    int lenA = A.size();
    int lenB = B.size();
    int less = 0;

    for (int i = lenA-1, j = lenB-1; j >= 0; j--, i--)
    {
        A[i] = A[i] - (B[j] - 48);
        if (A[i] < '0')
        {
            A[i] += 10;
            A[i-1]--;
        }
    }
    while (A.size() > 1 && A[0] == '0')
        A.erase(0, 1);//從指定pos位置起,刪除字符長度爲n的子串
    cout << A << endl;

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章