回复 10楼 青春无限
每次都是看看 ,瞧一瞧奥, 顶···能不能看看 青春无限 你的c实力。
// 程序功能: 输入一个正整数x,程序计算输出pi的值,精确到x位 // 文件名:pi.c // 作者QQ:1711285081 //最新修改时间:2013.6.10 13:15 // 版本:v0.2(第7次修改) // 编译器:VS2012 x64(cl pi.c) GCC 4.7.2 x86(gcc pi.c -o pi) // 运行环境:windows server 2012 intel x86_64 // 试运行输出: // lwb603569640@windows_server_2012 /g/projects // $ pi // 输入小数位数:100 // 计算了328次 // ---第1-1000位小数--- // PI=3.1415926535 8979323846 2643383279 5028841971 6939937510 // 5820974944 5923078164 0628620899 8628034825 3421170346 #include <stdio.h> int main() { int len,i;//len小数长度 int numerator=1,denominator=3,result,carry; int flag=1,count=0; //继续迭代的标志及迭代的次数 char *pi,*temp; //指向保存pi值和临时计算结果的数据 printf("输入小数位数:"); scanf("%d",&len); len+=2; //增加2位 if(!(pi=(char *)malloc(sizeof(char)*len))) //分配保存pi值的内存 { printf("分配内存失败!\n"); exit(0); } if(!(temp=(char *)malloc(sizeof(char)*len))) //分配保存临时值的内存 { printf("分配内存失败!\n"); exit(0); } for(i=0;i<len;i++)//初始化数组 pi[i]=temp[i]=0; pi[1]=2; //置初值 temp[1]=2; while(flag && (++count<2147483647)) //int的最大值是2147483647 { carry=0; for(i=len-1;i>0;i--)//从低位到高位相乘 { result=temp[i]*numerator+carry; //用每一位去乘 temp[i]=result%10; //保存个数 carry=result/10; //进位 } carry=0; for(i=0;i<len;i++) //由高到低进行除法运算 { result=temp[i]+carry*10; //当前位加上前一位的余数 temp[i]=result/denominator; //当前位的整数部分 carry=result%denominator; //当前位的余数,累加到下一位的运算 } flag=0; //清除标志 for(i=len-1;i>0;i--) //由低位到高位,将计算结果累加 { result=pi[i]+temp[i]; //将计算结果累加到x中 pi[i]=result%10; //保留一位数 pi[i-1]+=result/10; //向高位进位 flag|=temp[i];//若temp中的数全部为0,退出循环 } numerator++; //累加分子 denominator+=2; //累加分母 } printf("\n计算了%d次\n",count); //输出迭代次数 printf("\t---第1-1000位小数---\n"); printf("PI=%d.",pi[1]);//输出整数部分 for(i=2;i<len;i++) { if((i>2) && (i-2)%10==0) //每10位小数间加一个空格 printf(" "); if((i>2) && (i-2)%50==0) //每50位小数换行 printf("\n"); if(i>2 && (i-2) % 1000 ==0)//第1000位小数显示一个提示 { printf("\t---按任意键显示第%d-%d位小数---\n",(i-2)/1000*1000+1,((i-2)/1000+1)*1000); getch(); } printf("%d",(int)pi[i]); } getch(); return 0;