求π的近似算法
#include <stdio.h> #include <math.h> #include <time.h> #include <stdlib.h> #define N 30000 int main() { double e = 1.0, b = 0.5, c, d; //e为边长,b为边长的一半 long int i; //i: 正多边形边数 float x, y; int c2 = 0, d2 = 0; puts("\n >> Result of Regular Polygon Approximating:"); for(i = 6; ; i *= 2) { //正多边形边数加倍 d = 1.0 - sqrt(1.0 - b*b); b = 0.5 * sqrt(b*b + d*d); //b为新多边形边长的一半 if(2*i*2*b �C i*e < 1e-15) break; //精度达1e-15则停止计算 e = 2*b; //保存新多边形的边长 } printf("-----------------------------------------\n"); /*以下输出π值和正多边形的边数*/ printf(">>pi=%.15lf\n",2*i*b); printf(">>The number of edges of required polygon:%ld\n",i); printf("-----------------------------------------\n"); randomize(); while(c2++ <= N) { x = random(101); //x:坐标。 y = random(101); //y:坐标。 if(x*x + y*y <= 10000) //判断点是否落在圆内 d2++; } puts("\n >> Result of Random Number Method:"); printf("----------------------------------------\n"); printf(" >> pi=%f\n",4.*d2/N); //输出求出的π值 printf("----------------------------------------\n"); puts("\n Press any key to quit..."); getch(); return 0; }
#include <stdio.h> int main() { int n, count = 0; printf(">>Please input a number to verify(0 to quit):"); scanf("%d",&n); //输入任一整数 while(n != 0) { printf(">>------Results of verification:-------\n"); do { if(n % 2) { n = n*3 + 1; //若为奇数,n乘3加1 printf(">>Step No.%d: %d*3+1=%d\n",++count,(n-1)/3,n); } else { n /= 2; //若为偶数n除以2 printf(">>Step No.%d: %d/2=%d\n",++count,2*n,n); } }while(n != 1); //n不等于1则继续以上过程 printf(">> ----------------------- ----------\n"); printf(">>Please input a number to verify(0 to quit):"); scanf("%d",&n); //输入任一整数 } puts("\n Press any key to quit..."); getch(); return 0; }
#include <stdio.h> void verify_four_squares(int number) { int i,j,k,n; for(i = 1; i < number/2; i++) //穷举法。试探i,j,k,n的不同值 for(j = 0; j < i; j++) for(k = 0; k < j; k++) for(n = 0; n < k; n++) if(number == i*i + j*j + k*k + n*n) { printf(">>%d=%d*%d+%d*%d+%d*%d+%d*%d\n", number,i,i,j,j,k,k,n,n); return; } } int main() { int number = 1; while(number != 0) { printf(">>Please input a number to verify(0 to quit):"); scanf("%d",&number); //输入任一整数 if(number == 0) break; printf(">>------Results of verification: ----\n"); verify_four_squares(number); printf(">>-----------------------------------\n"); } puts("\n Press any key to quit..."); getch(); return 0; }
#include <stdio.h> void vr6174(int); void parse_sort(int num, int *each); void max_min(int *each, int *max, int *min); void parse_sort(int num, int *each); int count = 0; int main() { int n = 1; while(n != 0) { printf(">>Please input a 4-digit number to verify(0 to quit): "); scanf("%d",&n); //输入任一整数 if(n == 0) break; printf(">>-----Results of verification: ------\n"); count = 0; vr6174(n); //调用函数进行验证 printf(">> ----------------------------------\n"); } puts("\n Press any key to quit..."); getch(); return 0; } void vr6174(int num) { int each[4], max, min; if(num != 6174 && num) { //若不等于6174且不等于0则进行运算 parse_sort(num,each); //将整数分解,数字存入each数组中 max_min(each,&max,&min); //求数字组成的最大值和最小值 num = max - min; //求最大值和最小值的差 printf(">> Step No.%d: %d-%d=%d\n",++count,max,min,num); //输出该步计算过程 vr6174(num); //递归调用自身继续进行卡布列克运算 } } void parse_sort(int num,int *each) { int i,*j,*k,temp; for(i = 0; i <= 4; i++) { //将NUM分解为数字 j = each + 3 - i; *j = num%10; num /= 10; } for(i = 0; i < 3; i++) //对各数字从小到大进行排序 for(j=each,k=each+1; j < each+3-i; j++,k++) if(*j > *k) { temp = *j; *j = *k; *k = temp; } return; } //下面函数将分解的数字还原为最大整数和最小整数 void max_min(int *each, int *max, int *min) { int *i; *min = 0; for(i = each; i < each+4; i++) //还原为最小的整数 *min = *min * 10 + *i; *max = 0; for(i = each+3; i >= each; i--) //还原为最大的整数 *max = *max * 10 + *i; return; }