1. 程式人生 > >使用C++類實現大數加法,大數減法,大數乘法

使用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  那麼結果肯定是負數  就列印一個負