有问题就有答案
Q1:怎么计算小数点前1000位
获取小数点后1000位那时不可能的因为就算是double型数据这个是最大的数据类型 占8位它的取值范围也只是由-1.7E308~1.7E308远远就没有1000位 最多也就是308位没有现成的数据类型能显示那么多小数位,可以自己设计个算法输出任意多位的小数,如5/7的小数后1000位public class Test {public static void main(String[] args) {int i=5,k=7;int n=1000;System.out.print(i/k+".");for(int ii=0;ii<n;ii++){i=i%k*10;System.out.print(i/k);}}}
Q2:怎么编个程序,输出圆周率的小数点后1000位,(想要多少就多少)
引言 网上流传着一个怪异的求pi程序,虽然只有三行却能求出pi值连小数点前共800位。这个程序如下: /*某年Obfuscated C Contest佳作选录:*/ #include long a=10000, b, c=2800, d, e, f[2801], g; main(){ for(;b-c;)f[b++]=a/5; for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a) for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b); } /* (本程式可算出pi值连小数点前共800位) (本程式录自sci.math FAQ,原作者未详)*/ 咋一看,这程序还挺吓人的。别慌,下面就告诉你它是如何做到的,并且告诉你写怪异C程序的一些技巧。^_^ 展开化简 我们知道,在C语言中,for循环和while循环可以互相代替。 for(statement1;statement2;statement3){ statements; } 上面的for语句可以用下面的while语句来代替: statement1; while(statement2){ statements; statement3; } 而且要写怪异的C程序,逗号运算符无疑是一个好的助手,它的作用是: 从左到右依次计算各个表达式的值,并且返回最右边表达式的值。 把它嵌入for循环中是写怪异代码的常用技巧之一。所以,上面的程序可以展开为: #include /*1*//*2*/long a=10000, b, c=2800, d, e, f[2801], g; /*3*/main(){ /*4*/ while(b-c!=0){ /*5*/ f[b]=a/5; /*6*/ b++; /*7*/ } /*8*/ d=0; /*9*/ g=c*2; /*10*/ while(g!=0){ /*11*/ b=c; /*12*/ d+=f[b]*a; /*13*/ f[b]=d%--g; /*14*/ d=d/g--; /*15*/ --b; /*16*/ while(b!=0){ /*17*/ d=d*b+f[b]*a; /*18*/ f[b]=d%--g; /*19*/ d=d/g--; /*20*/ --b; /*21*/ } /*22*/ c-=14; /*23*/ printf("%.4d",e+d/a); /*24*/ e=d%a; /*25*/ d=0; /*26*/ g=c*2; /*27*/ } /*28*/ } /*29*/现在是不是好看一点了? 进一步化简 你应该能注意到a的值始终是10000,所以我们可以把a都换成10000。再就是,仔细观察g,在外层循环中,每次循环用它做除法或取余时,它总是等于2*c-1,而b总是初始化为c。在内层循环中,b每次减少1,g每次减少2。你这时会想到了吧?用2*b-1代替g!代进去试试,没错!另外,我们还能做一点化简,第26行的d=0是多余的,我们把它合并到第13行中去,第13行可改写为: d=f[b]*a; 。所以程序可以改为: #include long b, c=2800, d, e, f[2801]; main(){ while(b-c!=0){ f[b]=2000; b++; } while(c!=0){ b=c; d=f[b]*10000; f[b]=d%(b*2-1); d=d/(b*2-1); --b; while(b!=0){ d=d*b+f[b]*10000; f[b]=d%(b*2-1); d=d/(b*2-1); --b; } c-=14; printf("%.4d",e+d/10000); e=d%10000; } } 少了两个变量了! 深入分析 好了,马上进入实质性的分析了。一定的数学知识是非常有必要的。首先,必须知道下面的公式可以用来求pi: pi/2=1+1!/3!!+2!/5!!+3!/7!!+...+k!/(2*k+1)!!+... 只要项数足够多,pi就有足够的精度。至于为什么,我们留给数学家们来解决。 写过高精度除法程序的人都知道如何用整数数组来进行除法用法,而避免小数。其实很简单,回想一下你是如何徒手做除法的。用除数除以被除数,把得数放入结果中,余数乘以10后继续做下一步除法,直到余数是零或达到了要求的位数。 原程序使用的数学知识就那么多,之所以复杂难懂是因为它把算法非常巧妙地放到循环中去了。我们开始具体来分析程序。首先,我们从数学公式开始下手。我们求的是pi,而公式给出的是pi/2。所以,我们把公式两边同时乘以2得: pi=2*1+2*1!/3!!+2*2!/5!!+2*3!/7!!+...+2*k!/(2*k+1)!!+... 接着,我们把它改写成另一种形式,并展开: pi=2*1+2*1!/3!!+2*2!/5!!+2*3!/7!!+...+2*n!/(2*n+1)!! =2*(n-1)/(2*n-1)*(n-2)/(2*n-3)*(n-3)/(2*n-5)*...*3/7*2/5*1/3 +2*(n-2)/(2*n-3)*(n-3)/(2*n-5)*...*3/7*2/5*1/3 +2*(n-3)/(2*n-5)*...*3/7*2/5*1/3 +2*3/7*2/5*1/3 +2*2/5*1/3 +2*1/3 +2*1 对着公式看看程序,可以看出,b对应公式中的n,2*b-1对应2*n-1。b是从2800开始的,也就是说n=2800。(至于为什么n=2800时,能保证pi的前800位准确不在此讨论范围。)看程序中的相应部分: d=d*b+f[b]*10000; f[b]=d%(b*2-1); d=d/(b*2-1); d用来存放除法结果的整数部分,它是累加的,所以最后的d将是我们要的整数部分。而f[b]用来存放计算到b为止的余数部分。 到这里你可能还不明白。一是,为什么数组有2801个元素?很简单,因为作者想利用f[1]~f[2800],而C语言的数组下标又是从0开始的,f[0]是用不到的。二是,为什么要把数组元素除了f[2800]都初始化为2000?10000有什么作用?这倒很有意思。因为从printf("%.4d",e+d/10000); 看出d/10000是取d的第4位以前的数字,而e=d%10000; ,e是d的后4位数字。而且,e和d差着一次循环。所以打印的结果恰好就是我们想要的pi的相应的某4位!开始时之所以把数组元素初始化为2000,是因为把pi放大1000倍才能保证整数部分有4位,而那个2就是我们公式中两边乘的2!所以是2000!注意,余数也要相应乘以10000而不是10!f[2800]之所以要为0是因为第一次乘的是n-1也就是2799而不是2800!每计算出4位,c都要相应减去 14,也就保证了一共能够打印出4*2800/14=800位。但是,这竟然不会影响结果的准确度!
Q3:excel 小数点
你看到的只是显示的小数位数,实际存储的可能有很多位小数,可以用round函数,统一小数位数四舍五入
Q4:33除以70 小数点后1000位 是多少 怎么算
33/70=0.47142857142857142857142857142857142857 .从小数点后第二位开始,它是一个714285的循环。由于1000/6=166大于4,小数点后第1000位与之前第4位相同,即4。
Q5:圆周率前1000位小数
首先您要搞清楚:什么叫做圆周率?什么叫做正6x2ⁿ边率?圆周率指的是:“圆周长与直径的比值”用π表示,π值至今尚未发现。而所谓的圆周率3.1415926.....是根据正6x2ⁿ边形的周长与过中心点的对角线的比值叫正6x2ⁿ边率。因此正6x2ⁿ边率不等于圆周率。如果把圆周长与直径3分之1的比值称为圆周率,那么圆周率π的值是6+2√3。
Q6:C# 计算圆周率小数点后1000位,谁能给写个代码 控制台的
这个可以用多线程实现 我以前写过,不过是VC写的。下面是核心代码 你修改成C#版本的即可DWORD WINAPI ThreadFuncPi(LPVOID lParam){ CString str,str1; int Count=-1; int isfirst; //精确到7999位 long a=10; //缩放的倍数 long c=88000; //迭代的次数 long f[88001]; //中间的计算结果 long d; //内循环误差累计项 long e=0; //外循环误差累计项 long b, g; //分子 与 分母. k/(2k+1) int i; for(i=0;i0) { d=0; g=(c*2+1)-2; // 分母部分 b=c; //分子 while(1) { d*=b; d+=f[b]*a; f[b]=d%g; //带分数的 分子部分 d/=g; //带分数的 整数部分 g-=2; b--; if(b==0) break; } Sleep(10); str.Format("%1d",e+d/a); m_Show.ReplaceSel(str,FALSE); if(isfirst){m_Show.ReplaceSel(".",FALSE); isfirst=0;} str1.Format("%d",++Count); SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_xs,str1); //Count++; //itoa(Count,ch,10); //SetDlgItemText(IDC_xs,ch); e=d%a; c-=11; //因为精度固定为800位,每输出1位后,相当于精度需求降低了1位,所以每次可以少算11项 // SetDlgItemText(IDC_xs,ch); } return 0;}