如何简化复用类似如下这种代码
#include <stdio.h>#include <time.h>#include <math.h>void disp(double s0,double s9){ printf( "s0 = %.15f\ns9 = %.15f\ns0/s9 = %.15f\n\n\n", s0, s9, s0/s9);}double calcS(int n){ double s=0.0; int i,k; k=(int)pow(10.0,n-1); for(i=k;i<10*k;i++) s+=1.0/i; return s; }//------------------------------void search_1(){ double s9,s0; s9=s0=0.0; int a; for (a=1;a<=8;a++) s0+=1.0/a; s9=calcS(1)-s0; disp(s0,s9);}void search_2(){ double s9,s0; s9=s0=0.0; int a,b; for (a=1;a<=8;a++) for (b=0;b<=8;b++) s0+=1.0/(10*a+b); s9=calcS(2)-s0; disp(s0,s9);}void search_3(){ double s9,s0,s; s9=s0=0.0; int a,b,c; for (a=1;a<=8;a++) for (b=0;b<=8;b++) for (c=0;c<=8;c++) s0+=1.0/(100*a+10*b+c); s9=calcS(3)-s0; disp(s0,s9);}void search_4(){ double s9,s0,s; s9=s0=0.0; int a,b,c,d; for (a=1;a<=8;a++) for (b=0;b<=8;b++) for (c=0;c<=8;c++) for (d=0;d<=8;d++) s0+=1.0/(1000*a+100*b+10*c+d); s9=calcS(4)-s0; disp(s0,s9);}void search_5(){ double s9,s0,s; s9=s0=0.0; int a,b,c,d,e; for (a=1;a<=8;a++) for (b=0;b<=8;b++) for (c=0;c<=8;c++) for (d=0;d<=8;d++) for (e=0;e<=8;e++) s0+=1.0/(10000*a+1000*b+100*c+10*d+e); s9=calcS(5)-s0; disp(s0,s9);}void search_6(){ double s9,s0,s; s9=s0=0.0; int a,b,c,d,e,f; for (a=1;a<=8;a++) for (b=0;b<=8;b++) for (c=0;c<=8;c++) for (d=0;d<=8;d++) for (e=0;e<=8;e++) for (f=0;f<=8;f++) s0+=1.0/(100000*a+10000*b+1000*c+100*d+10*e+f); s9=calcS(6)-s0; disp(s0,s9);}void search_7(){ double s9,s0,s; s9=s0=0.0; int a,b,c,d,e,f,g; for (a=1;a<=8;a++) for (b=0;b<=8;b++) for (c=0;c<=8;c++) for (d=0;d<=8;d++) for (e=0;e<=8;e++) for (f=0;f<=8;f++) for(g=0;g<=8;g++) s0+=1.0/(1000000*a+100000*b+10000*c+1000*d+100*e+10*f+g); s9=calcS(7)-s0; disp(s0,s9);}void search_8(){ double s9,s0,s; s9=s0=0.0; int a,b,c,d,e,f,g,h; for (a=1;a<=8;a++) for (b=0;b<=8;b++) for (c=0;c<=8;c++) for (d=0;d<=8;d++) for (e=0;e<=8;e++) for (f=0;f<=8;f++) for(g=0;g<=8;g++) for(h=0;h<=8;h++) s0+=1.0/(10000000*a+1000000*b+100000*c+10000*d+1000*e+100*f+10*g+h); s9=calcS(8)-s0; disp(s0,s9);}void search_9(){ double s9,s0,s; s9=s0=0.0; int a,b,c,d,e,f,g,h,i; for (a=1;a<=8;a++) for (b=0;b<=8;b++) for (c=0;c<=8;c++) for (d=0;d<=8;d++) for (e=0;e<=8;e++) for (f=0;f<=8;f++) for(g=0;g<=8;g++) for(h=0;h<=8;h++) for(i=0;i<=8;i++) s0+=1.0/(100000000*a+10000000*b+1000000*c+100000*d+10000*e+1000*f+100*g+10*h+i); s9=calcS(9)-s0; disp(s0,s9);}int main(void){ double t0=clock(); search_1(); search_2(); search_3(); search_4(); search_5(); search_6(); search_7(); search_8(); search_9(); printf("Elapsed time: %f s\n",(clock()-t0)/CLOCKS_PER_SEC); return 0;}
void search_impl(double& s0,int* v,int d,int cur = 0) { if(d == 0) { double div = 0.0; int fac = 1; for(int i = cur - 1 ; i >= 0 ; -- i) { div += v[i] * fac; fac *= 10; } s0 += 1.0 / div; return; } for(int i = cur == 0 ? 1 : 0 ; i <= 8 ; ++ i) { v[cur] = i; search_impl(s0,v,d - 1,cur + 1); } } void search_x(int d) { int arr[100]; double s0 = 0.0; search_impl(s0,arr,d); //handle s0,s9... }
[解决办法]
将1到9编号的函数写成一个search(int x)传递参数进去,然后根据x值的不同循环次数不同