请教:被除数/除数=商的问题,商是循环小数,商要计算到小数点后面900位,出现循环为止,怎么实现啊!!!

时间:2022-03-21 20:32:23
被除数/除数=商的问题,商是循环小数,商要计算到小数点后面900位,出现循环为止,怎么实现啊!!!算法怎么实现啊!请赐教!!!谢谢!!!!!

6 个解决方案

#1


用String进行浮点运算,本来调用CPU命令进行的浮点运算就不准确

#2


只能利用字串了

#3


呵呵,看来你指望着定义为DOUBLE什么的都不行了,只能进行位运算。自己写一个函数吧,好像网上有这方面的资料

#4


靠~~
高精度计算也有人问??
到书店找个奥林匹克教材,前几页就讲了,拿个本子抄下来,一切ok
买下来太浪费

#5


呵呵,参考下面的:

细嚼慢咽--高精度除法
    我们知道,程序设计用的高级语言,数据的精度有单、双精度,最高的计算结果是十进制有效位17位。我在学生程序设计竞赛时,出了一道题目:做诸如355/113的计算,要求的精度是算到出现循环为止。计算机专业的学生学过几种语言,知道355/113要算111位,达不到。有人说题目出错了。不对!程序设计竞赛就要你动脑筋。

    其实,这种手算,做竖式的除法,小学生都会算的。问题是计算机如何模拟做竖式除法。动脑筋,其实和做作文一个道理,先要仔细审题。

    记不得是哪个伟人讲过:人类在给自己出题目时,已经在题目中包含了解题的思路。出题目,是划定一个问题的域,就是问题的范围。读懂题目,理解题意,是不跑题的前提。作文不能跑题,程序设计也不能跑题。怎么会跑题呢?就是你光去想:用什么语句?这就是你跑题的开始。你要想:普通人,不用计算机,如何去做?把常人对问题的解决办法考虑一遍,寻找出路。把思路滤清。理出头绪来,一步一步是如何进行的。接着,就是要计算机如何去模拟这个过程。

    下面,我们就针对小学生手工做竖式除法,讨论一个实例:355/113=?



         3.141592...    除法是否继续进行,要看余数和以前的重复没有?
    113/355
        339 
         160                第一个余数是16,乘10,再除
         113 
          470               第二个余数是47,乘10,再除
          452 
           180              第三个余数是18,乘10,再除
           113 
            670             第四个余数是67,乘10,再除
            565 
            1050            第五个余数是95,乘10,再除
            1017 
              330           第六个余数是33,乘10,再除
              226 
              1040          第七个余数是104,乘10,再除...
-------------------------------------------------------------
  下面,X、Y中已经有被除数、除数;Text1是输出结果的文本框;数组a(800)用来存放各次的余数,
a(m)中的m,从0起,存一个,m=m+1。ys是当前的余数,先和以往的余数从a(0)比较到a(m),如果相等,
就不再除下去了;如果比较以往所有的余数,都不相等,m=m+1,这个余数保存进a(m),回头(back)再做。

Private Sub Command2_Click()       点击这里,运行程序。
Text1.Text = Int(x / y) & "."
a(0) = x Mod y: ys = a(0): m = 0
back:
ys = ys * 10: s = Int(ys / y): ys = ys Mod y
v = Str(s): v = Right(v, 1)    '商在s是个数值,要把数值化为数字,还要把前面的空格去掉,成v
Text1.Text = Text1.Text + v    '单个数字的商,才可以逐个拼接到文本框中去。
For i = 0 To m
If ys = a(i) Then
  GoTo there
End If
Next i
m = m + 1: a(m) = ys: GoTo back
there:                         '这里是不再除下去时,把小数位数,向窗体用Print方法输出
Cls
Print "小数"; m; "位后出现循环"
Print x; "/"; y; "="           '再在文本框上,把除法的两个值相除等于标记上去。
End Sub


    上下对照,看明白没有?你要学会抽象思维。上面的算法,能不能不写出来,要学会在脑子里想!
    此外,还希望你能够悟到些程序设计的思路。比如,余数比较,比第一个时,就要用比较全部的循环。凡事要想远一点,全面一点!

    当然,VB的程序设计,开头要做界面窗体的控件设计,决定用什么控件、又用什么事件去驱动它。要按问题的需要来考虑、要让使用者方便来选择。这里,Command1用来‘设定’两个数,Command2用来开始‘计算’。程序设计,经典的思想,还是过程代码的编写。

    我们的注意力还是放到程序设计的过程代码编写上吧。

#6


~|~

#1


用String进行浮点运算,本来调用CPU命令进行的浮点运算就不准确

#2


只能利用字串了

#3


呵呵,看来你指望着定义为DOUBLE什么的都不行了,只能进行位运算。自己写一个函数吧,好像网上有这方面的资料

#4


靠~~
高精度计算也有人问??
到书店找个奥林匹克教材,前几页就讲了,拿个本子抄下来,一切ok
买下来太浪费

#5


呵呵,参考下面的:

细嚼慢咽--高精度除法
    我们知道,程序设计用的高级语言,数据的精度有单、双精度,最高的计算结果是十进制有效位17位。我在学生程序设计竞赛时,出了一道题目:做诸如355/113的计算,要求的精度是算到出现循环为止。计算机专业的学生学过几种语言,知道355/113要算111位,达不到。有人说题目出错了。不对!程序设计竞赛就要你动脑筋。

    其实,这种手算,做竖式的除法,小学生都会算的。问题是计算机如何模拟做竖式除法。动脑筋,其实和做作文一个道理,先要仔细审题。

    记不得是哪个伟人讲过:人类在给自己出题目时,已经在题目中包含了解题的思路。出题目,是划定一个问题的域,就是问题的范围。读懂题目,理解题意,是不跑题的前提。作文不能跑题,程序设计也不能跑题。怎么会跑题呢?就是你光去想:用什么语句?这就是你跑题的开始。你要想:普通人,不用计算机,如何去做?把常人对问题的解决办法考虑一遍,寻找出路。把思路滤清。理出头绪来,一步一步是如何进行的。接着,就是要计算机如何去模拟这个过程。

    下面,我们就针对小学生手工做竖式除法,讨论一个实例:355/113=?



         3.141592...    除法是否继续进行,要看余数和以前的重复没有?
    113/355
        339 
         160                第一个余数是16,乘10,再除
         113 
          470               第二个余数是47,乘10,再除
          452 
           180              第三个余数是18,乘10,再除
           113 
            670             第四个余数是67,乘10,再除
            565 
            1050            第五个余数是95,乘10,再除
            1017 
              330           第六个余数是33,乘10,再除
              226 
              1040          第七个余数是104,乘10,再除...
-------------------------------------------------------------
  下面,X、Y中已经有被除数、除数;Text1是输出结果的文本框;数组a(800)用来存放各次的余数,
a(m)中的m,从0起,存一个,m=m+1。ys是当前的余数,先和以往的余数从a(0)比较到a(m),如果相等,
就不再除下去了;如果比较以往所有的余数,都不相等,m=m+1,这个余数保存进a(m),回头(back)再做。

Private Sub Command2_Click()       点击这里,运行程序。
Text1.Text = Int(x / y) & "."
a(0) = x Mod y: ys = a(0): m = 0
back:
ys = ys * 10: s = Int(ys / y): ys = ys Mod y
v = Str(s): v = Right(v, 1)    '商在s是个数值,要把数值化为数字,还要把前面的空格去掉,成v
Text1.Text = Text1.Text + v    '单个数字的商,才可以逐个拼接到文本框中去。
For i = 0 To m
If ys = a(i) Then
  GoTo there
End If
Next i
m = m + 1: a(m) = ys: GoTo back
there:                         '这里是不再除下去时,把小数位数,向窗体用Print方法输出
Cls
Print "小数"; m; "位后出现循环"
Print x; "/"; y; "="           '再在文本框上,把除法的两个值相除等于标记上去。
End Sub


    上下对照,看明白没有?你要学会抽象思维。上面的算法,能不能不写出来,要学会在脑子里想!
    此外,还希望你能够悟到些程序设计的思路。比如,余数比较,比第一个时,就要用比较全部的循环。凡事要想远一点,全面一点!

    当然,VB的程序设计,开头要做界面窗体的控件设计,决定用什么控件、又用什么事件去驱动它。要按问题的需要来考虑、要让使用者方便来选择。这里,Command1用来‘设定’两个数,Command2用来开始‘计算’。程序设计,经典的思想,还是过程代码的编写。

    我们的注意力还是放到程序设计的过程代码编写上吧。

#6


~|~