|
[原创]大整数的乘法
将注释的程序(略有改动)写在下面:
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 |
|