哈哈,我先出个题目。 1.编写一个400位整数加法程序的。 2编写一个200位×200位的程序。 看谁用的内存最少?
下面是我的作品,不过使用C++写的。
如果要计算400位的加法一般需定义maxN=398。(10^400/256)
[此贴子已经被作者于2004-10-17 15:34:59编辑过]
#include <iostream> #include <limits>
using namespace std;
/*********************************************************** 下面是我定义的函数用于计算的(用于解决计算时丢失数据精度的问题) 在其中存储的都是——》十六《——进制数 ***********************************************************/ //////////////////////////////// const maxN=400;//如果要计算更大的数请更改
//注意由于在这里没有字节类型的就使用了char来存放数值 //在这里source1里存储的不是字符数值,而是16进制的数 //这里的方法主要是借鉴了汇编语言中处理大数值相乘相加的方法 //addMyArray返回值用于判断是否溢出 //而mulMyArray不存在益处的问题 bool addMyArray(unsigned char source1[maxN],unsigned char source2[maxN])//source1+source2->source1 { unsigned int i=0; unsigned int tmp=0; unsigned char carry=0;
for(i=0;i<maxN;i++) { tmp=source1[i]+source2[i]+carry; source1[i]=static_cast<unsigned char>(tmp); carry=static_cast<unsigned char>(tmp>>numeric_limits<unsigned char>::digits); } if(carry==0) { return true; } else { return false; } }
//source1*source2->direct void mulMyArray(unsigned char source1[maxN],unsigned char source2[maxN],unsigned char direct[2*maxN]) { unsigned int i=0,j=0; unsigned int tmp=0,tmp2=0;
for(i=0;i<arrayMaxN;i++) { direct[arrayMaxN]=0; }
for(i=0;i<maxN;i++) { tmp=source2[i]; for(j=0;j<maxN;j++) { tmp*=source1[j]; direct[i+j]+=static_cast<unsigned char>(tmp); direct[j+i+1]+=static_cast<unsigned char>(tmp>>numeric_limits<unsigned char>::digits); } } } /************************************************************************* 上面是我自定义的函数用于计算的 ***********************************************************************/