搜索
楼主: 赵林
打印 上一主题 下一主题

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++编译器就是这样的。

11#
发表于 2017-10-7 20:05:50 | 显示全部楼层
赵林 发表于 2017-10-7 19:35
我相信你
因为我也不相信有这个标准
但他就是这样的奇怪

一个抄一个
自然就出现了                        

点评

有一首诗,查了二十多个网站,都错了同一个字  发表于 2017-10-8 15:20
10#
发表于 2017-10-7 13:55:56 | 显示全部楼层
赵林 发表于 2017-10-7 13:21
C99标准:可以不使用new运算符或malloc函数动态分配数组空间

并没有这个标准
自己查 isostd 去
9#
发表于 2017-10-6 20:54:11 | 显示全部楼层
逸飞扬_VbCNT 发表于 2017-8-18 13:36
cpc协会是绝对良心,天地良心,大神也别在cpc集体面前喷,否则我和赵林,以及cpc全体成员,喷死他!

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

真是没救了
你知不知道乱搞未定义行为会产生很麻烦的后果
7#
发表于 2017-8-19 14:51:36 | 显示全部楼层
赵林 发表于 2017-8-19 14:43
任何人在争论我就要把他的回帖扔掉

其实我比较好奇怎么扔掉……            
6#
发表于 2017-8-19 14:51:12 | 显示全部楼层
赵林 发表于 2017-8-19 14:41
但是你忘了一件事
我的电脑运行别人10毫秒的程序需要100毫秒

我的意思是当N比较大的时候,你的高精度乘法会 TLE
不需要拿你的机器的速度来说
5#
发表于 2017-8-19 10:43:10 | 显示全部楼层
赵林 发表于 2017-8-19 10:32
可惜,O(N2)也只需要356毫秒
而且你申请的是竖式专利
不是变换的专利

我并没有说我要申请专利
我从开始到现在的意思都是,高精度乘法有更快的算法
并且356ms已经很慢了
地板
发表于 2017-8-19 07:05:24 | 显示全部楼层
赵林 发表于 2017-8-18 13:33
可以:
int *p;
p=new int [m];

那么就请你在主题中改正回来
板凳
发表于 2017-8-18 14:18:08 | 显示全部楼层
赵林 发表于 2017-8-18 13:35
sorry!
如果你能写出一种正常的O(NlogN)的代码,不用发给我了。直接去申请专利吧。
如果能发明一个类似 ...

我还有一句话要说
计算机科学界没有诺贝尔奖只有turing
沙发
发表于 2017-8-18 14:12:10 | 显示全部楼层
赵林 发表于 2017-8-18 13:35
sorry!
如果你能写出一种正常的O(NlogN)的代码,不用发给我了。直接去申请专利吧。
如果能发明一个类似 ...

申请专利?
你们都不会Google的吗?
https://zh.wikipedia.org/wiki/%E ... 6%E5%8F%98%E6%8D%A2
快速傅里叶变换可以做到在O(NlogN)的时间复杂度内解决高精度乘法
楼主
发表于 2017-8-18 11:22:47 | 显示全部楼层
另外第9行是不符合C++标准的(至少到目前还没有)
编译通过只代表编译器容忍这个做法
#
发表于 2017-8-18 11:20:44 | 显示全部楼层
然而你这个算法是O(N^2)
跟我来写O(NlogN)的FFT吧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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