搜索
查看: 1018|回复: 31
打印 上一主题 下一主题

cpc_大数乘法位数不够?使用这个计算器!

[复制链接]
跳转到指定楼层
楼主
发表于 2017-8-18 09:19:53 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
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的名声。
没有任何恶意代码,按要求解压没有任何问题。

cpc_乘法计算器.rar

324.91 KB, 下载次数: 17

文件有点大,但不是我的问题,C++编译器就是这样的。

来自 7#
 楼主| 发表于 2017-8-18 13:38:05 | 只看该作者
逸飞扬_VbCNT 发表于 2017-8-18 13:36
cpc协会是绝对良心,天地良心,大神也别在cpc集体面前喷,否则我和赵林,以及cpc全体成员,喷死他!

不用这么激烈。
暂时不用和4399APPLE闹翻了。

点评

何况4399APPLE不是大神  发表于 2017-8-18 13:57
来自 12#
 楼主| 发表于 2017-8-19 10:33:52 | 只看该作者
更多争论见个人空间
为避免扰乱论坛秩序,
再此不争论了
来自 15#
 楼主| 发表于 2017-8-19 14:43:11 | 只看该作者
任何人在争论我就要把他的回帖扔掉
推荐
发表于 2017-8-19 14:51:36 | 只看该作者
赵林 发表于 2017-8-19 14:43
任何人在争论我就要把他的回帖扔掉

其实我比较好奇怎么扔掉……            

点评

大家都很好奇,毕竟我也有一段把“楼主”“版主”弄混的灰暗历史  发表于 2017-10-11 19:42
我也很好奇啊  发表于 2017-10-7 19:36
推荐
 楼主| 发表于 2017-11-21 17:11:13 | 只看该作者
创世菌 发表于 2017-11-19 11:11
哇哦,高精度算法!
在C++中,iostream库的确挺耗空间的。

有什么建议吗?(还是好好说话更好)

点评

能不需要输入位数吗?  发表于 2017-11-21 19:06
24#
发表于 2017-11-19 11:11:43 | 只看该作者
哇哦,高精度算法!
在C++中,iostream库的确挺耗空间的。

点评

正在编不需要输入位数的 其实也不难 只是当时为了调试方便 我觉得还应该自动忽略不正确的输入  发表于 2017-11-24 19:04
23#
发表于 2017-10-7 20:05:50 | 只看该作者
赵林 发表于 2017-10-7 19:35
我相信你
因为我也不相信有这个标准
但他就是这样的奇怪

一个抄一个
自然就出现了                        

点评

有一首诗,查了二十多个网站,都错了同一个字  发表于 2017-10-8 15:20
22#
 楼主| 发表于 2017-10-7 19:35:53 | 只看该作者
4399APPLE 发表于 2017-10-7 13:55
并没有这个标准
自己查 isostd 去

我相信你
因为我也不相信有这个标准
但他就是这样的奇怪
为什么百度百科和好几本C程序都不约而同地错了
21#
发表于 2017-10-7 13:55:56 | 只看该作者
赵林 发表于 2017-10-7 13:21
C99标准:可以不使用new运算符或malloc函数动态分配数组空间

并没有这个标准
自己查 isostd 去
20#
 楼主| 发表于 2017-10-7 13:21:19 | 只看该作者
4399APPLE 发表于 2017-8-18 11:22
另外第9行是不符合C++标准的(至少到目前还没有)
编译通过只代表编译器容忍这个做法

C99标准:可以不使用new运算符或malloc函数动态分配数组空间
19#
发表于 2017-10-6 20:54:11 | 只看该作者
逸飞扬_VbCNT 发表于 2017-8-18 13:36
cpc协会是绝对良心,天地良心,大神也别在cpc集体面前喷,否则我和赵林,以及cpc全体成员,喷死他!

你下面那句话放在 4 年前早就被 rosynirvana 怼了
18#
发表于 2017-10-6 20:53:29 | 只看该作者
逸飞扬_VbCNT 发表于 2017-8-18 13:36
cpc协会是绝对良心,天地良心,大神也别在cpc集体面前喷,否则我和赵林,以及cpc全体成员,喷死他!

真是没救了
你知不知道乱搞未定义行为会产生很麻烦的后果
16#
发表于 2017-8-19 14:51:12 | 只看该作者
赵林 发表于 2017-8-19 14:41
但是你忘了一件事
我的电脑运行别人10毫秒的程序需要100毫秒

我的意思是当N比较大的时候,你的高精度乘法会 TLE
不需要拿你的机器的速度来说
14#
 楼主| 发表于 2017-8-19 14:41:53 | 只看该作者
4399APPLE 发表于 2017-8-19 10:43
我并没有说我要申请专利
我从开始到现在的意思都是,高精度乘法有更快的算法
并且356ms已经很慢了

但是你忘了一件事
我的电脑运行别人10毫秒的程序需要100毫秒
13#
发表于 2017-8-19 10:43:10 | 只看该作者
赵林 发表于 2017-8-19 10:32
可惜,O(N2)也只需要356毫秒
而且你申请的是竖式专利
不是变换的专利

我并没有说我要申请专利
我从开始到现在的意思都是,高精度乘法有更快的算法
并且356ms已经很慢了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表