使用C++類實現大數加法,大數減法,大數乘法
這寫的就是垃圾,多數還是抄的,沒有意思,為了應付作業啥的可以拿去試試,好多東西都算不對。希望後面看到的能自己寫,不然以後還要像我一樣,重新寫一遍。
效果截圖:
#include <iostream>
#include <string>
#include <stdlib.h>
#define N 1000
//演算法基本實現思想:
//一、大數加法:
// 1.輸入大數時應該用字串,然後根據-'0'得出整數陣列
// 2.整數運算是先從低位運算,所以這裡用陣列逆儲存。
// 3.如果要比較兩個數字大小,先判斷他們的長度,如果長度相同,
// 就判斷他們的最高位,依次判斷,直到某一位不相等或者全部相同。
// 4.輸出。過載<<運算子實現輸出大數。
// 5.實現規則,和一般的加法一樣,同位相加,滿十進一,當一方只剩下零的時候可以
//二、大數減法:
// 1.比較被減數和減數,如果被減數大於減數,就要向高位借個一。
// 2.最後的一位數要注意,可能有多餘的零(忽略多餘)
// 或者全都是零,這時候最起碼應該輸出一個零
//三、大數乘法:
// 1.高精度與高精度乘法實現起來好可怕,
// 會出現整型溢位,所以要判斷一下。當每位上的數字大於10的時候,要進位。還是參考了一下演算法
class BigNum //大數資料結構型別
{
public:
int data[2 * N];
int len;
BigNum()
{
memset(data, 0, sizeof(data)); //初始化
len = 0;
}
//************************************************************
//函 數 名:Compare
//參 數:大數資料
//返 回 值:1 表示 a>b, -1 表示 a<b, 0 表示 a = b
// 主要為了實現> < =的判斷過載
//函式功能:判斷兩個資料的大小
//************************************************************
long Compare(BigNum a, BigNum b)
{
if (a.len > b.len)return 1;
else if (a.len < b.len)return -1;
else //如果兩數長度相等,只能進行每位判斷
{
for (int i = a.len; i >= 0; i--)
if (a.data[i]>b.data[i])return 1;
else if (a.data[i] < b.data[i])return -1;
}
return 0; //兩數相等
}
//+過載
BigNum& operator +(const BigNum &b)
{
BigNum c;
int carry = 0; //表示進位
int temp; //暫時儲存每一位上的資料
for (int i = 0; i < len || i < b.len; i++)
{
temp = data[i] + b.data[i] + carry; //進位一定要加上
c.data[c.len++] = temp % 10;
carry = temp / 10;
}
if (carry != 0) //最後一位的處理
{
c.data[c.len++] = carry;
}
return c;
}
//-過載
BigNum operator -(const BigNum &b)
{
BigNum c;
for (int i = 0; i < len || i < b.len; i++)
{
if (data[i] < b.data[i])
{
data[i + 1]--;
data[i] += 10;//借到了10
}
c.data[c.len++] = data[i] - b.data[i];
}
while (c.len - 1 >= 1 && c.data[c.len - 1] == 0)
{
c.len--;//保留了一位
}
return c;
}
//*過載
BigNum operator *(BigNum &b)
{
BigNum c;
for (int i = 0; i < len; i++)
{
for (int j = 0; j < b.len; j++)
c.data[i + j] += data[i] * b.data[j]; //i+j實現擴大十倍
}
for (int i = 0; i < 2 * N - 1; i++)
{
if (c.data[i] > 9)
{
c.data[i + 1] += c.data[i] / 10; //“瘦身”,即進位
c.data[i] = c.data[i] % 10;
}
}
int i = N - 1;
while (c.data[i] == 0&&i>=0)
i--;
if (i == -1) c.len = 1; //長度判斷和+ -不一樣,所以在這要用迴圈語句。
else c.len = i + 1;
return c;
}
//大於號判斷過載
const bool& operator >(BigNum &a)
{
if (Compare(*this, a) == 1)return true;
else return false;
}
//小於號判斷過載
const bool& operator <(const BigNum &a)
{
if (Compare(*this, a) == -1)return true;
else return false;
}
//等於號判斷過載
const bool& operator ==(const BigNum &a)
{
if (Compare(*this, a) == 0)return true;
else return false;
}
//輸出運算子過載
friend std::ostream& operator <<(std::ostream& os, const BigNum &a)
{
for (int i = a.len - 1; i >= 0; i--)
{
os << a.data[i];
}
return os;
}
//輸入運算子過載
friend std::istream& operator >>(std::istream& is, BigNum &a)
{
std::string str;
is >> str;
a.len = str.length();
for (int i = 0; i < a.len; i++)
{
a.data[i] = str[a.len-1-i]-'0'; //字元轉換成陣列
}
return is;
}
//還闊以過載>= <=,但是目前用不到
};
int main()
{
BigNum a,b,c;
std::string option;
std::cout << "請您輸入\na\n+\nb\n類似格式,若想判斷大小關係,請輸入\na\n=\nb\n類似格式:\n";
//迴圈測試
while (std::cin >> a >> option >> b)
{
std::cout << "━━━━━━━━━━━━━━━━━━━━" << std::endl;
switch (option[0])
{
case'+':std::cout << (c = a + b) << std::endl; break;
case'-':std::cout << (c = a - b) << std::endl; break;
case'*':std::cout << (c = a * b) << std::endl; break;
case'>':if (a > b)std::cout << "Yes\n";
else std::cout << "No\n"; break;
case'<':if (a < b)std::cout << "Yes\n";
else std::cout << "No\n"; break;
case'=':if (a == b)std::cout << "Yes\n";
else std::cout << "No\n";
}
std::cout << "請您繼續輸入:" << std::endl;
}
system("pause");
return 0;
}
相關推薦
使用C++類實現大數加法,大數減法,大數乘法
這寫的就是垃圾,多數還是抄的,沒有意思,為了應付作業啥的可以拿去試試,好多東西都算不對。希望後面看到的能自己寫,不然以後還要像我一樣,重新寫一遍。 效果截圖: #include <iostream> #include <string&g
YTUOJ——C++類實現最大數的輸出
題目描述 輸入n個數,找出最大的數並輸出。 輸入 輸入n,並輸入n個數。 輸出 輸出的最大的數,每個輸出結果佔一行。 樣例輸入 10 1 2 3 4 5 6 7 8 9 10 樣例輸出
整數大數模擬 高精度加法 高精度減法 高精度乘法 高精度除法 c/c++ java
描述 請計算a與b加減乘除的結果。a與b的值不超過100位,且為整數。 輸入 第一行,用例數T。 第二行,整數n,(1,2,3,4)分別表示加減乘除。 第三行,整數a與b。 輸出 輸出a與b計算後的值。(除法只需保留整數位)。 樣例輸入 4 1 1 2 2 10 8 3 4
C語言實現只用加法和減法實現兩個正整數的乘除運算
1、乘法a*b如下 #include<stdlib.h> #include<stdio.h> int main() { int a,b; int i,result=0; scanf("%d%d",a,b); for(
c語言實現菲波那切數列對大數求餘
如果百度搜索的話,解決這個問題的程式碼大部分使用C++或者java來寫的,用C寫的很少,因此今天小編獻上用C解決這個問題的程式碼。原題是這樣的 這是藍橋杯的一道練習題,如上題所述,輸入為給定的一個任意正數n,求其對應的菲波那切數列項對10007的餘數,看到題的同學可能二話
c語言實現輸出10000內所有素數,5個換一行
1 #include<stdio.h> 2 int main() 3 { 4 int i,j,k=0; 5 for(i=2;i<10000;i++) 6 { 7 for(j=2;j*j<=i;j++) 8
c語言實現顯示10000內所有素數,5個換一行
#include<stdio.h> int main() { int i,j,k=0; for(i=2;i<10000;i++) { for(j=2;j*j<=i;j++) if(i%j==0)
C語言實現5位數=2*4位數,9個數字互不相同
利用C語言求解這樣的兩個資料:5位數=2*4位數,9個數字互不相同 1 #include<stdio.h> 2 int main() 3 { 4 long x; 5 int p[10],i,t,k; 6 int num=0; 7 int n,f
c 語言實現24位bmp圖片載入,讀寫,放大縮小 .
發現好多人網上查詢c 語言版本的bmp影象讀取,儲存,放大,縮小程式,很難找到完整的。 現在將自己寫的貼出來 供大家學習參考交流。轉載請標明出處,尊重作者勞動成果。 /**********************************************************
C++ 高精度加法 高精度減法 高精度乘法1
轉自:http://blog.sina.com.cn/s/blog_4fdb102b010087ng.html 前言:由於計算機運算是有模運算,資料範圍的表示有一定限制,如整型int(C++中int 與long相同)表達範圍是(-2^31~2^31-1),unsigned
線性表C++類實現
線性表的定義:線性表是具有相同資料型別的n(n≥0)個數據元素有限序列。除第一個元素元素外都有前驅,除最有一個元素外都有後繼。 儲存是順序儲存成為順序表,鏈式儲存成為單鏈表。一下分別對順序表和單鏈表
C語言實現陣列的迴圈左移,右移,翻轉
陣列結合指標可以實現很多有趣的功能,比如下面這個程式:假設陣列為 : 12345如果左移一次即為:23451 ,依次類推如果右移一次即為:51234 ,依次類推翻轉則為:54321我們來實現下這個程式:
C++類實現二叉樹的構建和遍歷
#include<iostream> #include<fstream> #include<string.h> using namespace std; /*
利用C++類實現順序表
以前寫過用C語言實現的順序表,現在來看看用C++類實現的吧class SeqList { public: SeqList(int capacity=DEFAULT_CAPACITY) :_capacity(capacity) ,_size(0) ,_pData(
微控制器:c語言實現秒錶計數(按鍵開始,結束,重置)
實現秒錶計數功能,使用定時器和外部中斷實現。8號按鍵代表計時開始/結束,C號按鍵代表重置為0,為了演示方便,這裡上限定為15秒。 程式碼中有詳細的註釋: #include <reg52.h>
[資料結構]c語言實現鏈棧的入棧,出棧,清空,銷燬等操作
最近在學習資料結構中的棧,於是在此記錄一下棧鏈式結構的抽象資料型別 /* 棧的抽象資料型別 ADT 棧(stack) Data 同線性表。元素具有相同的型別,相鄰元素具有前驅和後繼關係 Operation InitStack(*S):初始化
C#類庫推薦 拼多多.Net SDK,開源免費!
# 背景介紹 近兩年拼多多的發展非常迅速,即便口碑一般,也沒有網頁端,奈何我們已經全面小康,6億月收入1000以下,9億月收入2000以下,所以因為價格原因使用拼多多的使用者也越來越多了。同樣的,拼多多也開放了部分API介面,提供給開發者使用,開放平臺也是一如既往的拼多多,沒法跟淘寶、京東等相比,至今沒有
stream,做減法,優化搜尋程式碼。
做一個搜尋,三個輸入條件,求這個條件的交集。起初我的思路是按照操作的流程,一步步的來做這三個篩選。 let searchResults = []; //step1 根據id搜尋,得到一個子集。 if (searchId) { //開始按照id查詢,查詢目標為allData
【c++大數加法】A+B陣列實現
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; char ac[10005]; char bc[1000
51nod1005大數加法(C語言實現大數)
大數相加 基本思路是: 1、兩個字串把大數讀進來 然後把每一位字元換成數字存到 x y 數組裡面 2、拿 x y 陣列從後往前 對應位相加 (注意進位) 相加的結果依次存到 c數組裡 3、然後對c陣列處理 如果最高位小於0 那麼結果肯定是負數 就列印一個負