<html>

<head><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- MyFirstUnitAd -->
<ins class="adsbygoogle"
     style="display:inline-block;width:970px;height:250px"
     data-ad-client="ca-pub-5778386704669218"
     data-ad-slot="1503492166"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>

<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>quantum simulation (collision)</title>
<style>
<!--
	table td.head{ 
		background-color: #3a6ba5;
		border: 1px #000000 solid;
		font-family: Verdana;
		font-weight: bold;
		font-size: 14px;
		color: #f79c19;
		padding: 6px;
	}

	table td.body{ 
		border-bottom: 1px #6699CC dotted;
		text-align: left;
		font-family: Verdana, sans-serif, Arial;
		font-weight: normal;
		font-size: 14px;
		color: #3A6BA5;
		background-color: #fafafa;
		padding: 6px;
	}
	
-->
</style>
</head>

<body>



<p align="left"><font size="6" color="#FF0000"><span lang="en-ca"><b>&nbsp; 
 
</b></span><b>&nbsp;&nbsp;&nbsp; <span lang="en-ca">&nbsp;&nbsp; Big Number</span></b></font></p>

<div align="left">
  <pre><b><font color="#ff0000" size="5">A. <span lang="en-ca">First </span>Edition</font></b></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>This is a sort of half-finished trial version and I highly suspect that I will continue on this small trial. It </b></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>all started by an enquiry of a new friend from China who is asking questions about numeric. For less than a week</b></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>I had some interest in this area and bought a book &quot;numeric recipes in C++&quot;. But quite soon I lost my focus during</b></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>my travel to Guangzhou, Shenzhen which is considered to be one of most developed area in economy in China.</b></span></pre>
</div>
<div align="left">
  <pre><b><font color="#ff0000" size="5"><span lang="en-ca">B</span>.<span lang="en-ca"><a name="problem"></a>The problem</span></font></b></pre>
  <pre><span lang="en-ca"><b>This problem should be very basic and common for any student in computer science who is interested in numeric </b></span></pre>
  <pre><span lang="en-ca"><b>area. How to store and calculate huge numbers which is bigger than 64 bit?</b></span></pre>
    
  <b><font color="#ff0000" size="5"><span lang="en-ca"><a name="explain"></a>C</span>.<span lang="en-ca">The
  </span></font></b><span lang="en-ca"><font size="5" color="#FF0000"><b>idea of 
  program</b></font></span><p><b><span lang="en-ca"><font size="2">The idea is 
  truly intuitive. I just store all digit as its ASCII code and mimic all 
  operations I learned in </font></span></b></p>
  <p><span lang="en-ca"><font size="2"><b>primary school.</b></font></span></div>
<pre><b><font color="#ff0000" size="5">D.<span lang="en-ca"><a name="Method"></a>The </span>major functions</font></b></pre>
<div align="left">
  <pre><span lang="en-ca"><b>.</b></span></pre>
</div>
<div align="left">
  <pre><b><font color="#ff0000" size="5"><span lang="en-ca">E</span>.</font></b><span lang="en-ca"><font size="5" color="#FF0000"><b>Further improvement</b></font></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>I half-finished this before I boarded the train for Guangzhou and it is just for record purpose I keep this </b></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>trivial, half-finished project.</b></span></pre>
</div>
<div align="left">
  <pre><b><font color="#ff0000" size="5"><span lang="en-ca">F</span>.</font></b><span lang="en-ca"><font size="5" color="#FF0000"><b>File listing</b></font></span></pre>
</div>
<div align="left">
  <pre><font size="3"><b><span lang="en-ca">1. list.h</span></b></font></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><font size="3"><b>2</b></font></span><font size="3"><b><span lang="en-ca">. list.cpp</span></b></font></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><font size="3"><b>3</b></font></span><font size="3"><b><span lang="en-ca">. number.h</span></b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b><span lang="en-ca">4. number.</span></b></font><span lang="en-ca"><font size="3"><b>cpp</b></font></span></pre>
</div>
<div align="left">
  <pre><font size="3"><b><span lang="en-ca">5. main.cpp</span></b></font></pre>
</div>
<div align="left">
  <pre>กก</pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><font size="3" color="#FF0000"><b>file name: list.h</b></font></span></pre>
</div>
<pre>#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

const int DefaultLength=10;

class List
{
private:
	char* list;
	int size;
	int counter;
	void expand();
public:
	void clear(){counter=0;}
	List(int initSize=DefaultLength);
	void add(char ch, bool atEnd=true);
	int count(){ return counter;}
	char&amp; operator[](int index);
	char operator[](int index) const;
	void setSize(int theSize);
	void setCount(int theCount);
};
</pre>
<pre>กก</pre>
<pre></pre>
<pre></pre>
<pre><span lang="en-ca"><font size="3" color="#FF0000"><b>file name: list.cpp</b></font></span></pre>
<pre>#include &quot;list.h&quot;
#include &lt;string.h&gt;
#include &lt;malloc.h&gt;

List::List(int initSize)
{
	if (initSize&lt;=0)
	{
		printf(&quot;size must be positive number\n&quot;);
		initSize=DefaultLength;
	}
	counter=0;
	
	setSize(initSize);
}

void List::setCount(int theCount)
{
	if (theCount&lt;=size&amp;&amp;theCount&gt;=0)
	{
		counter=theCount;
	}
}

void List::setSize(int theSize)
{
	size=theSize;
	if ((list=(char*)malloc(size*sizeof(char)))==NULL)
	{
		printf(&quot;cannot alloc memory\n&quot;);
		exit(1);
	}
}

void List::expand()
{
	//char* temp;
	//this is for safe, you won't lose your old data even if there
	//is low memory error
	if ((list=(char*)realloc(list, size*2*sizeof(char)))==NULL)
	{
		printf(&quot;cannot realloc\n&quot;);
		exit(1);
	}
	//memcpy(temp, list, size*sizeof(char));
	//printf(&quot;new size=%d\n&quot;, _msize(list));
	size*=2;
	//free(list);
	//list=temp;
}

void List::add(char ch, bool atEnd)
{
	if (counter==size)
	{
		expand();
	}
	if (atEnd)
	{
		list[counter]=ch;
	}
	else
	{
		//shift
		for (int i=counter; i&gt;0; i--)
		{
			list[i]=list[i-1];
		}
		list[0]=ch;
	}
	//always
	counter++;
}

char&amp; List::operator [](int index)
{
	if (index&gt;=0)
	{
		return list[index];
	}
}

char List::operator [](int index) const
{
	if (index&gt;=0&amp;&amp;index&lt;counter)
	{
		return list[index];
	}
	else
	{
		printf(&quot;index out of bound\n&quot;);
	}
}
</pre>
<pre>กก</pre>
<pre></pre>
<pre><span lang="en-ca"><font size="3" color="#FF0000"><b>file name: bignumber.h</b></font></span></pre>
<pre>#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &quot;list.h&quot;

//typedef char  Byte;

class Number
{
private:
	List list;
	void addZero(int howMany);
	void scaling(short digit);
	int carryOn;
	//void clear();
public:
	void readFromFile(char* fileName);
	void display();
	int count();
	Number operator*(int scalar);
	Number&amp; operator*(Number&amp; other);
	Number operator+(Number&amp; other);
	Number&amp; operator=(Number&amp; other);
};

</pre>
<pre>		
<span lang="en-ca"><font size="3" color="#FF0000"><b>file name: bignumber.cpp</b></font></span></pre>
<pre>#include &quot;bignumber.h&quot;
#include &lt;math.h&gt;

const int DecimalModulo=10;

void Number::readFromFile(char* fileName)
{
	FILE* stream;
	char ch;
	if ((stream=fopen(fileName, &quot;r&quot;))==NULL)
	{
		printf(&quot;cannot open file %s\n&quot;, fileName);
		exit(1);
	}
	
	while (!feof(stream))
	{
		ch=fgetc(stream);
		if (ch&gt;='0'&amp;&amp;ch&lt;='9')
		{
			list.add(ch);
		}
		else
		{
			if (!feof(stream))
			{
				printf(&quot;bad file\n&quot;);
				exit(1);
			}
		}
	}
}

int Number::count()
{
	return list.count();
}

void Number::display()
{
	int length=count();
	for (int i=0; i&lt;length; i++)
	{
		printf(&quot;%c&quot;, list[i]);
	}
	printf(&quot;\n&quot;);
}
	

Number Number::operator *(int scalar)
{
	div_t result;
	int subTotal=scalar;
	short digit=0;
	int shiftNumber=0;
	Number temp, theResult;
	
	do
	{
		temp=*this;
		result=div(subTotal, DecimalModulo);
		digit=result.rem;
		temp.addZero(shiftNumber);
		temp.scaling(digit);
		shiftNumber++;
		subTotal=result.quot;
		theResult=theResult+temp;
	}
	while(subTotal!=0);
	return theResult;
}

//internal method
void Number::scaling(short digit)
{
	short myNumber, subTotal;
	/*
	if (digit==0)
	{
		return;
	}
	*/
	carryOn=0;
	for (int i=count()-1; i&gt;=0; i--)
	{
		myNumber=list[i]-'0';
		subTotal=myNumber*digit+carryOn;
		list[i]=subTotal%10+'0';
		carryOn=subTotal/10;
	}
	if (carryOn&gt;0)
	{
		list.add(carryOn+'0', false);
	}
}



void Number::addZero(int howMany)
{
	for (int i=0; i&lt;howMany; i++)
	{
		list.add('0');
	}
}

Number&amp; Number::operator =(Number&amp; other)
{
	list.clear();
	for (int i=0; i&lt;other.count(); i++)
	{
		list.add(other.list[i]);
	}
	return *this;
}
	


Number Number::operator +(Number&amp; other)
{
	int myLength=count(), otherLength=other.count();
	int length=myLength&gt;otherLength?myLength:otherLength;
	short first, second, subTotal;
	Number result;
	carryOn=0;
	result.list.setSize(length);
	for (int i=0; i&lt;length; i++)
	{
		if (i&gt;=myLength)
		{
			first=0;
		}
		else
		{
			first=list[myLength-1-i]-'0';
		}
		if (i&gt;=otherLength)
		{
			second=0;
		}
		else
		{
			second=other.list[otherLength-1-i]-'0';
		}
		subTotal=first+second+carryOn;
		if (subTotal&gt;=10)
		{
			subTotal-=10;
			carryOn=1;
		}
		else
		{
			carryOn=0;
		}
		result.list[length-1-i]=subTotal+'0';
	}
	result.list.setCount(length);
	if (carryOn&gt;0)
	{
		result.list.add('1', false);
	}
	return result;
}
</pre>
<pre><span lang="en-ca"><font size="3" color="#FF0000"><b>file name: main.cpp</b></font></span></pre>
<pre>#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &quot;bignumber.h&quot;

int main()
{
	Number M, N, O;

	N.readFromFile(&quot;nick.txt&quot;);
	printf(&quot;this is N\n &quot;);

	N.display();
	//M=N;
	O=N*180;
	printf(&quot;O=N*180\n&quot;);
	O.display();
	M=O+N;
	printf(&quot;M=O+N=\n&quot;);
	M.display();

	return 0;
}</pre>

<p><span lang="en-ca"><font color="#0000FF"><b>running result:</b></font></span></p>

<p><span lang="en-ca"><font color="#0000FF"><b>The content of input file &quot;nick.txt&quot; 
is like following:</b></font></span></p>

<p><span lang="en-ca">
12345678901234344353535233333333333333333333443436689797670</span></p>

<p><span lang="en-ca"><font color="#0000FF"><b>And the running result is 
something like following:</b></font></span></p>

<p>this is N<br>
12345678901234344353535233333333333333333333443436689797670<br>
O=N*180<br>
2222222202222181983636342000000000000000000019818604163580600<br>
M=O+N=<br>
2234567881123416327989877233333333333333333353262040853378270<br>
Press any key to continue</p>

<p><br>
กก</p>

<pre></pre>

<pre></pre>

<pre></pre>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;                                   
&nbsp;&nbsp;&nbsp; <a href="PocketRuler.htm">                  







                       <img src="picture/back.gif" style="border: medium none" alt="back.gif (341 bytes)" width="32" height="35"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<a href="index.htm">
<img src="picture/up.gif" style="border: medium none" alt="up.gif (335 bytes)" width="35" height="32"></a>       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;                         
<img src="picture/next.gif" style="border: medium none" alt="next.gif (337 bytes)" width="32" height="35">          


</p>

</body>

</html>