ysr 发表于 2011-2-11 10:58

[原创]大整数的乘法

如下方法是否可编称?有无数学问题?
大整数的乘法(10进制)用竖式法,公式:(A1+A2+A3+……)(B1+B2+B3+……)=B1(A1+A2+A3+……)+B2(A1+A2+A3+……)+……
分段依次分别相乘,错位相加,等式右边逐项把括号逐一展开,其中A1A2……B1B2……为分段位数,每得到两相积就错位加,错位就是在高位段后补零,就是乘以10的N次方,N为各段位数,位数应小于等于计算机处理位数的1/3,这样不会溢出。每展开两个括号,就分段依次错位相加,在算下一个括号项,直到括号全部展开,各段字符按序并一起就是结果。A1B1起始一致,理论上从高位到低,或从低到高都好,考虑有999999这样数段的进位溢出问题,从低到高算,结果数段要顺序倒排,使高位段在前,低位段保留字符,始终有高位段与下一段错位相加,每次有一低位段保留不动,最终结果段位排列不要乱。举例:
2324*2526=5870424,26*24=624,26*23=598,错位加624+59800=60424,25+24=600,25*23=575,错位加600+57500=58100,再错位加60424+5810000=5870424
大整数的平方也可用此法。

ysr 发表于 2011-2-11 13:13

[原创]大整数的乘法

希望高手看看有没有问题

HXW-L 发表于 2011-2-11 18:12

[原创]大整数的乘法

2324*2526=5870424,是个小整数的乘法

ysr 发表于 2011-2-12 17:49

[原创]大整数的乘法

[这个贴子最后由ysr在 2011/02/12 05:51pm 第 1 次编辑]

网上有20位的计数器,做2个60位整数积,12345 67890 12345 67890 12345 67890 12345 67890 12345 67890 12345 67809 *12345 33333 44444 55555 66666 11111 33333 55555 77777 99999 11111)=12345(12345……77777)+123448765500000+137165295+(……=12345(12345……77777)+12344 89026 65295+67890(……=……
没做完,请谅解

ysr 发表于 2011-2-14 09:46

[原创]大整数的乘法

欢迎批评 指导!探讨 沟通!

ysr 发表于 2011-2-14 12:01

[原创]大整数的乘法

大整数的乘除开平方运算,分段位数是,每段小于等于计算机处理位数的1/3,开平方每段必须是偶数位数,加减运算段位位数可以是小于等于计算机处理位数的1/2,这样不会溢出。
祝愿朋友情人节快乐!

ysr 发表于 2011-2-15 15:49

[原创]大整数的乘法

不懂电脑,是否可以用于编称,希望高手指导!

zhaolu48 发表于 2011-2-16 20:27

[原创]大整数的乘法

[这个贴子最后由zhaolu48在 2011/02/16 08:48pm 第 1 次编辑]

这个程序是比较难的
用了一下午时间才编出这个程序
是只输入乘数与被乘数的位数然后随机生成被乘数与乘数
结果输出被乘数、乘数、积及相应的位数。
是在VF环境下编出的程序:
CLEAR
CLEAR ALL
use dscfk
acce ';是否删除原有记录(y/回车)? '; to pb
IF pb=';y';
DELETE ALL
PACK
ENDIF
inpu ';输入被乘数位数: '; to p
inpu ';输入乘数位数: '; to q
s=p/5
t=INT(s)
IF s=t
p=t
ELSE
p=t+1
ENDIF
s=q/5
t=INT(s)
IF s=t
q=t
ELSE
q=t+1
ENDIF
DIMENSION a(p),b(q),c(p+q)
k=100000
a=0
b=0
h=';被乘数:';
g=';';
a(p)=INT(RAND()*k)
e=INT(LOG10(a(p)))+1
g=g+STR(a(p),e)
FOR i=1 to p-1
e=e+5
a(p-i)=INT(RAND()*k)
g=g+RIGHT(STR(a(p-i)+k,6),5)
endf
APPEND BLANK
REPLACE mx with h,sz with g,ws with e
? h+g
?';被乘数是';+STR(e,3)+';位';
h=';乘数:';
g=';';
b(q)=INT(RAND()*k)
e=INT(LOG10(b(q)))+1
g=g+STR(b(q),e)
FOR i=1 to q-1
e=e+5
b(q-i)=INT(RAND()*k)
g=g+RIGHT(STR(b(q-i)+k,6),5)
endf
APPEND BLANK
REPLACE mx with h,sz with g,ws with e
? h+g
?';乘数是';+STR(e,3)+';位';
c=0
FOR i=1 to p
FOR j=1 to q
g=a(i)*b(j)
u=INT(g/k)
v=g-u*k
c(i+j)=c(i+j)+u
c(i+j-1)=c(i+j-1)+v
endf
endf
FOR i=2 to p+q
u=INT(c(i-1)/k)
v=c(i-1)-u*k
c(i-1)=v
c(i)=c(i)+u
endf
h=';积为:';
g=';';
e=INT(LOG10(c(p+q)))+1
g=g+STR(c(p+q),e)
FOR i=1 to p+q-1
e=e+5
g=g+RIGHT(STR(c(p+q-i)+k,6),5)
endf
APPEND BLANK
REPLACE mx with h,sz with g,ws with e
? h+g
?';积是:';+STR(e,3)+';位';
需要建立一个数据库:其结构是
字段名         类型               宽度
MX             字符型               8
WS             数值型               3
KG             字符型               1
SZ             字符型             200
运行的结果保留在数据库中。
运行一次,结果是
被乘数85位:2620465459197653386411335669008550350038359292178811385663848663421961607790834650597
乘数75位:353134651665923403696162773229573729469787347282333636706751095833499125428
积159位:925377157136347346486464657840043315349899441110735694440889654271823777000891986276351512271376903163518559298007485943773362049725234787225586141757458080516

zhaolu48 发表于 2011-2-17 05:30

[原创]大整数的乘法

[这个贴子最后由zhaolu48在 2011/02/17 05:38am 第 1 次编辑]

我不懂VB,因为VB保存数据不如VF方便,因此没学。
中文解释似乎比编程还费劲,慢慢来吧。请原谅!

zhaolu48 发表于 2011-2-17 09:55

[原创]大整数的乘法

将注释的程序(略有改动)写在下面:
CLEAR                                       &&清屏
CLEAR ALL                                 &&清内存
use dscfk                                 &&打开保存结果的数据库
acce ';是否删除原有记录(y/回车)? '; to pb    &&是否把';y';给予pb
IF pb=';y';                                 &&如果pb=';y';
DELETE ALL                                  &&对数据库原记录作删除记号
PACK                                        &&删除记录
ENDIF                                       &&完成了“如果”
inpu ';输入被乘数位数: '; to p               &&输入被乘数的位数给p
inpu ';输入乘数位数: '; to q
s=p/5                                 &&以下是把p变换为除以5后商的整数部分t(当不整除时,要加1)
t=INT(s)
IF s=t
p=t
ELSE
p=t+1
ENDIF
s=q/5
t=INT(s)
IF s=t
q=t
ELSE
q=t+1
ENDIF
DIMENSION a(p),b(q),c(p+q)                     &&定义一维数组变量,c(p+q)是保存积的数组
k=100000                                    &&将数字分5位一段
a=0
b=0
h=';被乘数:';
g=';';                                           &&定义一个字符型变量g                           
a(p)=INT(RAND()*k)                           && rand()是随机产生一个区间(0,1)上的实数,并且乘k取整为被乘数的前5位a(p)
e=INT(LOG10(a(p)))+1                           &&计算a(p)的实际位数e
g=g+STR(a(p),e)                              &&把a(p)变换为字符串保存为被乘数的首e位
FOR i=1 to p-1                              &&进入p-1阶循环
e=e+5
a(p-i)=INT(RAND()*k)                               &&随机产生第i个5位数赋予a(p-i)
g=g+RIGHT(STR(a(p-i)+k,6),5)                     &&把第i个5位数加在输出字符串上
endf                                  &&进入下一步循环
APPEND BLANK                      &&追加空记录
REPLACE mx with h,sz with g,ws with e                     &&空记录中的字段sz用字符型被乘数替换
? h+g                      &&屏幕显示被乘数
?';被乘数是';+STR(e,3)+';位';
h=';乘数:';
g=';';
b(q)=INT(RAND()*k)
e=INT(LOG10(b(q)))+1
g=g+STR(b(q),e)
FOR i=1 to q-1
e=e+5
b(q-i)=INT(RAND()*k)
g=g+RIGHT(STR(b(q-i)+k,6),5)
endf
APPEND BLANK
REPLACE mx with h,sz with g,ws with e
? h+g
?';乘数是';+STR(e,3)+';位';
c=0                     &&把零赋予数组c(p+q)
FOR i=1 to p                     &&用双层循环作乘法
FOR j=1 to q
g=a(i)*b(j)
u=INT(g/k)                     &&求g的倒数5位之前的数字u
v=g-u*k                     &&g的后5位数字v
c(i+j)=c(i+j)+u                     &&将u加在c(i+j)上
c(i+j-1)=c(i+j-1)+v                     &&将v加在c(i+j-1)上
endf
endf
FOR i=2 to p+q                     &&上面得到的c(i)(i=1,2,…,p+q-1)一般不是5位数,
u=INT(c(i-1)/k)                     &&用此循环将其化为每一个c(i)(i=1,2,…,p+q-1)都不超过5倒数
v=c(i-1)-u*k
c(i-1)=v
c(i)=c(i)+u
endf
h=';积为:';                     &&以下是将积化为字符串形式
t=p+q
IF c(t)=0
t=t-1
ENDIF
g=';';
e=INT(LOG10(c(t)))+1
g=g+STR(c(t),e)
FOR i=1 to t-1
e=e+5
g=g+RIGHT(STR(c(t-i)+k,6),5)
endf
APPEND BLANK
REPLACE mx with h,sz with g,ws with e
? h+g
?';积是:';+STR(e,3)+';位';
积不能超过200位,若超过200位,可将如下句子前加“*”。
将凡是
APPEND BLANK
REPLACE
前加“*”为
*APPEND BLANK
*REPLACE
数据库也可以不打开,即把
use dscfk 前加“*”为
*use dscfk
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: [原创]大整数的乘法