1. 程式人生 > >用面向物件的思想實現一個有理數以及有理數的加減乘除運算——Python版本

用面向物件的思想實現一個有理數以及有理數的加減乘除運算——Python版本

class Rational(object):
  def __init__(self,a,b=1):
    if(b ==0 ):#對於分母為0的情況直接舉異常
      raise Exception("Denominator must not be 0!")
    else:
      g = self.gcd(abs(a), abs(b))#求分子分母的最大公約數然後進行約分
      self.a = a/g
      self.b = b/g

  def gcd(self,a,b):#求最大公約數
    if(b==0):return a
    else:return self.gcd(b,a%b)
#以下為運算子過載
def __add__(self, another): try: return Rational(self.a*another.b +another.a*self.b,self.b*another.b) except TypeError: return NotImplemented def __mul__(self, another): try: return Rational(self.a*another.a,self.b*another.b) except TypeError: return NotImplemented
def __sub__(self, another): try: return Rational(self.a * another.b - self.b * another.a, self.b * another.b) except TypeError: return NotImplemented def __div__(self, another): try: return Rational(self.a * another.b, self.b * another.a) except TypeError: return
NotImplemented def __str__(self): return '%s/%s' % (self.a, self.b) if self.b != 1 else str(self.a) # Below are tests: a = Rational(3,6) b = Rational(4,5) print a,b print a+b print a*b print b-a print b/a a = Rational(3,7) b = Rational(4) print a,b print a+b print a*b print b-a print b/a a = Rational(3) b = Rational(4,7) print a,b print a+b print a*b print b-a print b/a

注意

在運算子過載的時候Python2和Python3有細微的不同,如果沒有實際經驗會報以下錯誤

TypeError: unsupported operand type(s) for /: ‘Rational’ and ‘Rational’

問題主要出在過載除法運算子的時候2和3有以下差異:

Python3 uses special division names: __truediv__ and __floordiv__ for the / and // operators, respectively.
python2 uses __div__

相關推薦

面向物件思想實現一個有理數以及有理數乘除運算——Python版本

class Rational(object): def __init__(self,a,b=1): if(b ==0 ):#對於分母為0的情況直接舉異常 raise Except

面向物件思想實現一個有理數以及有理數乘除運算——Scala版本

有理數 有理數是“數與代數”領域中的重要內容之一,在現實生活中有廣泛的應用,是繼續學習實數、代數式、方程、不等式、直角座標系、函式、統計等數學內容以及相關學科知識的基礎。數學上,有理數是一個整數a和一個正整數b的比,例如3/8,通則為a/b。0也是有理數。有理

c#,面向物件思想一個計算器

      設計模式的第一個例子之後,我再次體會到了做一個軟體,不僅僅是為了功能的實現,更多的是“為人民服務”!       不用面向物件的方法去寫,要實現一個簡單的只有“+ - * /”計算器,那是相當簡單的,只需獲取使用者輸入的數字和運算子,然後“A運算B”得出結果顯示

使用面向物件的程式設計思想實現乘除運算

指令碼1Main 函式的程式碼: using System; using System.Collections.Generic; using System.Linq; using System.Tex

面向物件方法實現簡易計算器

#計算器 面向物件寫法 import tkinter class jsq: #初始魔術方法 def __init__(self): self.a = False self.root = tkinter.Tk()

面向物件方法實現求圓和橢圓的周長與面積

  設最底層的基類為Shape,Shape有周長和麵積,圓Circle和橢圓Ellipse繼承於Shape,設定計算周長的介面為circum(),計算面積的介面為area()。繼承圖表如下: 圖(1) Shape、Circle和Ellipse之間的繼承圖表

jsDate物件的setDate()函式對日期進行操作

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 function addDate(date,days){ var d=new Date(date); d.setDate(d.getDate()+days); var mo

js實現兩個文本框數值的乘除運算

element tle utf-8 運算 tel 加減 value 加減乘除 tex <!DOCTYPE html><html> <head> <meta charset="utf-8"> <title></

Js BigDecimal實現精確乘除運算的方法

func num 精確 pre fix 加減乘 結果 返回值 try 加法函數,用來得到精確的加法結果function accAdd(arg1, arg2) {var r1, r2, m, c;try {r1 = arg1.toString().split(".&

c語言設計簡單計算器實現乘除運算

      編寫程式的目的就是使程式有他應用的地方,編寫一個簡單的計算器來實現我們計算的目的。           利用swich  case 語句和迴圈結構來實現簡單程式的編寫。利用選擇語句來進行輸入的選

java BigDecimal實現精確乘除運算

java.math.BigDecimal。BigDecimal一共有4個夠造方法,讓我先來看看其中的兩種用法: 第一種:BigDecimal(double val) Translates a double into a BigDecimal. 第二種:BigDecim

使用位操作實現乘除運算

前言 在實際應用中一定要注意邊界問題,包括上邊界和下邊界 注意: 位操作中常用的公式 a=n&(n-1);//去掉n中最右邊的1; b=n&(-n);//得到n中最右邊的1 -n==~

每日一練——大數乘除運算實現(網易筆試題)

前幾天做網易筆試題時最後一道題是設計一個大數類,實現加減運算,因為做這道題時只有5分鐘,結果我剛把類寫出來,考試時間就結束了。其實在去年12月我寫過一個RSA的加解密程式,其中就用到了大數的加減乘除運算(當然這只是RSA用到的一小部分),沒有把最後一題寫上去實在太可惜了(&

如何只用邏輯運算實現算術乘除運算

      我們知道,在邏輯代數中,有與、或、非三種基本邏輯運算。通過三種基本邏輯運算之間的組合運算,又可以構造出與非、或非、異或等常用運算。我們在編寫計算機程式碼的時候,通過加減乘除運算子可以很容易地實現該基本運算,但是我們如何使用邏輯運算來實現算術加減乘除基本運算呢?

JAVA 實現精確的乘除運算

從上面程式碼的執行結果看出:JAVA在加減乘除運算時易發生精度丟失,達不到我們想要的計算結果;為了能夠精確表示、計算浮點數,JAVA提供了BigDecimal類,可以以BigDecimal為基礎定義一個Arith工具類,程式碼如下: import java.math.B

使用BigDecimal實現精確乘除運算

商業計算不要使用浮點數在前幾期的每日一練題目中,有一道題目是,需要精確計算的時候一定要使用BigDecimal。在本科時候其實計算機原理就曾經學過計算機的浮點數表示,但是從小數學的慣性思維上,總覺得乘法

實現加法計算(不用乘除運算子)

題目: 不用加減乘除實現兩個數相加。 解題:第一步:不考慮進位,兩個數相加sum(例如:5+7=2) 第二步:求進位carry(例如:5+7有進位10) 第三步:sum加carry,若有進位返回第一步,若無進位,

面向物件重寫thread 實現多次呼叫一個執行緒

思路:   利用thread類中,run方法在子執行緒中呼叫,其他方法在主執行緒呼叫,所以將生產者寫入主執行緒,將消費者寫入run函式中在子執行緒中執行,完成生產者消費者模型 注意:   1.  要在 init 函式中例項化一個Queue佇列作為生產者消費者中介   2.  要在 init 函式中把d

面向物件思想一個計算器

public class Calculate { private int num1; private int num2; public int getNum1() { return num1; } public void setNum1(in

面向物件思想程式設計思想使用requests、lxml模組爬取酷我音樂榜單的音樂,並用json格式匯出檔案。

首先匯入響應的模組: import requests from lxml import etree import json 然後新建一個class類,並建立需要的例項: class KuwoSpider: def __init__(self):