首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

怎么简化复用类似如上这种代码

2012-09-02 
如何简化复用类似如下这种代码C/C++ code#include stdio.h#include time.h#include math.hvoid disp

如何简化复用类似如下这种代码

C/C++ code
#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;} 


感觉search_函数每一个和他上面的那个函数结构上很类似,可是却没有用上,以至于下面的函数越写越长,在不改变算费的前提下,想知道能否简化。

[解决办法]
把a,b,c,d等存放在数组里,并传递该数组和数组长度。在search中根据数组长度来写。
[解决办法]
1~N的s0是个定值吧,处理好直接保存数组就行了
[解决办法]
有个递归的写法,会稍慢..
C/C++ code
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值的不同循环次数不同

热点排行