int整型变量最大2^31-1,long long最大2^63-1(大约是1后面18个0)。这么大的数一般足以满足我们的需求。但如果有时遇到特别大的数或是需要精确的小数(例如1234567.123456789012345678901),在进行乘法时出现溢出(位数不够)。以下计算器把整数的每一位存储到一个数组变量中,可计算任意大的整数的乘法。那小数呢?把小数位数数一数,当成整数算,最后加上就行了。
提示:这是C++代码,请勿在任何C语言编译器上使用,会导致出错。如果你使用C编译器,请直接下载文章尾部的可执行文件。
另外,如果编译器版本不够高,对第9行等动态定义数组报错,请使用new运算符和指针。(C中没有new)或直接打开尾部的可执行文件。
[mw_shl_code=c,true]#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
int i,j,wa,wb,t=0;
cout<<"乘数1数位:";
cin>>wa;
int a[wa];
char ch;
cout<<"乘数1:";
for(i=wa-1;i>=0;i--)
{
ch=getch();
if(ch>47 && ch<58)
{
a=ch-48;
cout<<a;
}
else
i--;
}
getch();
cout<<endl<<"乘数2数位:";
cin>>wb;
int b[wb],n[wb][wa+wb],s[wa+wb];
cout<<"乘数2:";
for(i=wb-1;i>=0;i--)
{
ch=getch();
if(ch>47 && ch<58)
{
b=ch-48;
cout<<b;
}
else
i--;
}
for(i=0;i<wb;i++)
for(j=0;j<wa+wb;j++)
n[j]=0;
for(i=0;i<wa+wb;i++)
s=0;
getch();
for(i=0;i<wb;i++)
{
for(j=0;j<wa;j++)
{
n[i+j]=(a[j]*b+t)%10;
t=(a[j]*b+t)/10;
}
n[i+j]=t;
t=0;
}
for(j=0;j<wa+wb;j++)
{
s[j]=t;
for(i=0;i<wb;i++)
s[j]=s[j]+n[j];
t=s[j]/10;
s[j]=s[j]%10;
}
system("cls");
for(i=wa-1;i>0;i--)
if(a!=0)
break;
for(;i>=0;i--)
cout<<a;
cout<<"×";
for(i=wb-1;i>0;i--)
if(b!=0)
break;
for(;i>=0;i--)
cout<<b;
cout<<"=";
for(i=wa+wb-1;i>0;i--)
if(s!=0)
break;
for(;i>=0;i--)
cout<<s;
getch();
return 0;
}[/mw_shl_code]
最后,如果出现异常,可能是位数太多(大概500000位以上就不行了,什么概念?1后面五十万个0),内存不够。不是程序的问题。请勿恶意输入。严禁败坏cpc的名声。
没有任何恶意代码,按要求解压没有任何问题。
|