数学中国

 找回密码
 注册
搜索
热搜: 活动 交友 discuz
楼主: moranhuishou

一款可瞬间判定素数的神奇小软件

[复制链接]
发表于 2008-9-21 23:39 | 显示全部楼层

一款可瞬间判定素数的神奇小软件

[这个贴子最后由keren在 2008/09/21 11:43pm 第 1 次编辑]

看看.                          
发表于 2008-9-22 14:36 | 显示全部楼层

一款可瞬间判定素数的神奇小软件

我手上没有VB6.0。
等有空写Pascal的源代码,好吗?
发表于 2008-9-22 14:43 | 显示全部楼层

一款可瞬间判定素数的神奇小软件

下面引用由moranhuishou2008/09/21 06:03pm 发表的内容:
有一个疑问:
以上的程序代码的编写本来就应该是程序开发者的事情,用户只要写 + - * /  ...就行了。为什么开发者要把这些工作转嫁给用户?
你到网站上去搜索一下,可能有别人作好大整数运算的dll。也就是可能有些程序员真的写好了这些程序供大家使用
 楼主| 发表于 2008-9-22 21:06 | 显示全部楼层

一款可瞬间判定素数的神奇小软件

下面引用由数学爱好者A2008/09/22 02:43pm 发表的内容:
你到网站上去搜索一下,可能有别人作好大整数运算的dll。也就是可能有些程序员真的写好了这些程序供大家使用
看了一下,大都是c++语言,虽然我不大懂,但看来好像还都没有天山草先生的好。
但用这样的程序作单独的四则没问题,如果要实现循环计算还有难度,我试了,很不好弄。
例如这样的式子:
a*(b+c)-x*[a*(b+c)-2]\x
的循环计算(对 a).
发表于 2008-9-22 21:37 | 显示全部楼层

一款可瞬间判定素数的神奇小软件

让A的最后一位加1,这不存在算法困难.
 楼主| 发表于 2008-9-22 22:22 | 显示全部楼层

一款可瞬间判定素数的神奇小软件

你理解错了,当然能够循环计算(原来的程序运行没错),但是不能在这样的大数程序运算的代码中循环(也许能,是我还没弄好)。
不过好像不是你说的“让A的最后一位加1”那么简单。
发表于 2008-9-22 22:26 | 显示全部楼层

一款可瞬间判定素数的神奇小软件

[这个贴子最后由simpley在 2008/09/22 10:27pm 第 1 次编辑]

是这么简单.让A的最后一个数组加1,没错
发表于 2008-9-24 04:07 | 显示全部楼层

一款可瞬间判定素数的神奇小软件

[这个贴子最后由数学爱好者A在 2008/09/24 03:02pm 第 1 次编辑]

Private Sub Command1_Click()
   Dim aa(100000)  As  integer      ';存放被加数的各位数字
   Dim bb(100000)  As  integer     ';存放加数的各位数字
   Dim cc(100000)  As  integer      ';存放和的各位数字
   Dim  Ln  As  integer  ';此变量用来放字符串的长度时使用
    Dim  cd  As  Long
   Dim  ad as Long   
   Dim  rd as Long
   Dim  dd as Long      ';此四个变量运算时使用
   a = Text1.Text
   b = Text2.Text
   GoSub sub1
   
   
   
   
   Exit Sub  ';主程序结束
   
sub1:
   La = Len(a)
Ln=La
Rd=La mod 4  
La=la\4      ';把 a 字串(被加数)转换成10000进制的各位数码放在数组 aa(i)中
   For  i = 1 To La    ';aa(1)为最低位,
     aa(i) = Val(Mid(a, Ln - 4*i + 1, 4))
   Next i
  if Rd>0 then
  aa(i)=Val(Mid(a, 1, Rd))
   La=La+1
  Endif
   Lb = Len(b)        ';把 b 字串(加数)转换成10000进制的各位数码放在数组 bb(i)中
    Ln=Lb
    Rd=Lb mod 4  
   For i = 1 To Lb    ';bb(1)为最低位,为最高位
     bb(i) = Val(Mid(b, Lb - 4*i + 1, 4))
   Next i
    if Rd>0 then
   bb(i)=Val(Mid(b, 1, Rd))
   Lb=Lb+1
  Endif
   If La >= Lb Then LL = La  Else LL = Lb
  cd=0       ';进位置0
   For i = 1 To LL
   dd=0
   dd=aa(i)+bb(i)+cd      ';带进位加
    rd=dd mod 10000     ';取出加后的第i位
   cd= dd\10000             ';取出加后的进i位
  cc(i)=rd
    Next i
   cc(i)=cd
   c = ""         
   For i = 1 To LL + 1
   
   c = Trim$(Str$(cc(i))) & c
   Next i
   
   
   
  Text3.Text = c
   
   Return
   
   End Sub

下面是Pascal代码
const TM=1000000000;    //定义1000000000进制数的权
...............
function TForm1.GIntAdd(s1,s2:string):string;  //从参数带入加数,返回和
var i,j,k,La,Lb,m,cd,dd,ad:integer;
    aa,bb,cc:array of integer;
    s:string;
begin
La := Length(s1);
Lb := Length(s2);
if La>=Lb then k := La else k :=Lb;
k :=k div 9;                  //确定数组长度(从10进制转换成1000000000进制)
k :=k+1;
SetLength(aa,k);
SetLength(bb,k);
SetLength(cc,k+1);
for i :=0 to k-1 do
begin
aa:=0;
bb:=0;
cc:=0
end;
cc:=0;
j := La mod 9;
m := La div 9;
m := m-1;
for i := 0 to  m do
begin
s := Copy(s1,La-9*(i+1)+1,9);
aa :=StrToInt(Trim(s));
end;
if j>0 then
begin
s := Copy(s1,1,j);
aa :=StrToInt(Trim(s));
end;
j := Lb mod 9;
m := Lb div 9;
m := m-1;
for i := 0 to  m do
begin
s := Copy(s2,Lb-9*(i+1)+1,9);
bb :=StrToInt(Trim(s));
end;
if j>0 then
begin
s := Copy(s2,1,j);
bb :=StrToInt(Trim(s));
end;
k :=k-1;
cd:=0;
for i :=0 to k do
begin
ad := aa+bb+cd;
dd := ad mod TM;
cd := ad div TM;
cc := dd;
end;
cc :=cd;
k :=k+1;
s:=';';;
for i := 0 to k do
s:=IntToStr(cc)+s;
Result := s;
end;
这部分代码经过调试验证,没有问题。下面是验证结果
        28253485967575738487667658577347623
    + 8447465254567417888684765423567874857
---------------------------------------------------------------------
      8475718740534993627172433082145222480
发表于 2008-9-24 17:21 | 显示全部楼层

一款可瞬间判定素数的神奇小软件

十进制字符串和二进制数组相互转换的程序已经写好了,通过了调试.
发表于 2008-9-25 17:49 | 显示全部楼层

一款可瞬间判定素数的神奇小软件


对于加法:
    For i = 1 To LL + 1
      If cc(i) >= 10 Then
         cc(i) = cc(i) - 10
         cc(i + 1) = cc(i + 1) + 1    ';此处可能产生 cc(LL + 1) = 1 的问题
      End If                          ';但不可能产生 cc(LL + 2) = 1 的问题
    c = Trim$(Str$(cc(i))) & c
    Next i
可以改写为:
    For i = 1 To LL
         cc(i+1) = cc(i+1)+int(cc(i)/10)
         cc(i) = cc(i) mod 10
    c = Trim$(Str$(cc(i))) & c
    Next i
      If cc(LL+1) > 0 Then c = Trim$(Str$(cc(LL+1))) & c
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|数学中国 ( 京ICP备05040119号 )

GMT+8, 2024-7-1 05:50 , Processed in 0.062500 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表