請設計一個一百億的計算器

首先要明白這道題目的考查點是什麼,java

一是你們首先要對計算機原理的底層細節要清楚、要知道加減法的位運算原理和知道計算機中的算術運算會發生越界的狀況,面試

二是要具有必定的面向對象的設計思想。
首先,計算機中用固定數量的幾個字節來存儲的數值,因此計算機中可以表示的數值是有必定的範圍的,爲了便於講解和理解,咱們先以byte 類型的整數爲例,它用1個字節進行存儲,表示的最大數值範圍爲-128到+127。-1在內存中對應的二進制數據爲11111111,若是兩個-1相加,不考慮Java運算時的類型提高,運算後會產生進位,二進制結果爲1,11111110,因爲進位後超過了byte 類型的存儲空間,因此進位部分被捨棄,即最終的結果爲11111110,也就是-2,這正好利用溢位的方式實現了負數的運算。-128 在內存
中對應的二進制數據爲10000000,若是兩個-128相加,不考慮Java運算時的類型提高,運算後會產生進位,二進制結果爲1,00000000,因爲進位後超過了byte類型的存儲空間,因此進位部分被捨棄,即最終的結果爲00000000,也就是0,這樣的結果顯然不是咱們指望的,這說明計算機中的算術運算是會發生越界狀況的,兩個數值的運算結果不能超過計算機中的該類型的數值範圍。因爲Java中涉及表達式運算時的類型自動提高,咱們沒法用byte類型來作演示這種問題和現象的實驗,數組

你們能夠用下面一個使用整數作實驗的例子程序體驗一下:
int a = Integer.MAX_VALUE;
int b = Integer.MAX_VALUE;
int sum = a + b;
System.out.println(「a=」+a+」,b=」+b+」,sum=」+sum);
先不考慮long類型,因爲int的正數範圍爲2的31次方,表示的最大數值約等於2*1000*1000*1000,
也就是20億的大小,app

因此,要實現一個一百億的計算器,咱們得本身設計一個類能夠用於表示很大的整數,而且提供了與另一個整數進行加減乘除的功能,大概功能以下:
()這個類內部有兩個成員變量,一個表示符號,另外一個用字節數組表示數值的二進制數
()有一個構造方法,把一個包含有多位數值的字符串轉換到內部的符號和字節數組中
()提供加減乘除的功能框架

[java] view plain copyide

 

  1. public class BigInteger //表示很大的整數  
  2. {  
  3.     int sign;   //標識符號  
  4.     byte[] val; //用字節數組表示數值的二進制數  
  5.   
  6.     //構造方法,把一個包含有多位數值的字符串轉換到內部的符號和字節數組中  
  7.     public Biginteger(String val)   
  8.     {  
  9.     sign = ;  
  10.     val = ;  
  11.     }  
  12.   
  13.     //+-*%方法  
  14.     public BigInteger add(BigInteger other){}    
  15.     public BigInteger subtract(BigInteger other){}  
  16.     public BigInteger multiply(BigInteger other){}  
  17.     public BigInteger divide(BigInteger other){}  
  18. }  


 

 

備註:要想寫出這個類的完整代碼,是很是複雜的,若是有興趣的話,能夠參看jdk 中自帶的
java.math.BigInteger 類的源碼。面試的人也知道誰都不可能在短期內寫出這個類的完整代碼的,他要的
是你是否有這方面的概念和意識,他最重要的仍是考查你的能力,因此,你不要由於本身沒法寫出完整的
最終結果就放棄答這道題,你要作的就是你比別人寫得多,證實你比別人強,你有這方面的思想意識就可
以了,畢竟別人可能連題目的意思都看不懂,什麼都沒寫,你要勇於答這道題,即便只答了一部分,那也
與那些什麼都不懂的人區別出來,拉開了距離,算是矮子中的高個,機會固然就屬於你了。另外,答案中
的框架代碼也很重要,體現了一些面向對象設計的功底,特別是其中的方法命名很專業,用的英文單詞很
精準,這也是能力、經驗、專業性、英語水平等多個方面的體現,會給人留下很好的印象。spa

相關文章
相關標籤/搜索