算法学习系列2.1

来源:互联网 发布:国外视频软件 编辑:程序博客网 时间:2024/06/05 04:10

均采用C++通过。

  • 1、子序列的和,多组数据输入 n< m<10^6,输出1/n^2+1/(n+1)^2+…+1/m^2,结束标记为m=n=0

    void subsequence(){

    long n[5],m[5];int k,i,j;//控制输入,这儿最多输入5组数据,学艺不精啊for(k = 0;k<5;k++){    scanf("%ld%ld",&n[k],&m[k]);    if(! (n[k]) && ! (m[k]) ) break;}//计算相应值,但注意超出范围。for(i =0;i<k;i++){    long double sum = 0;    for(j = n[i];j<=m[i];j++){        sum += 1.0/(long double)(j*j);    }    printf("%.5lf\n",sum);}

    }

  • 2、将1,2…9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2:3的比例,试求出,输出所有满足条件的数

    void choise(int *a,int n){

    int i,j,k,temp;for(i=0;i<n-1;i++) {    k=i; //给记号赋值    for(j=i+1;j<n;j++)        if(a[k]>a[j]) k=j; //是k总是指向最小元素    if(i!=k) { //当k!=i是才交换,否则a[i ] 即为最小        temp=a[i];        a[i]=a[k];        a[k]=temp;    }}

    }

    void permutation(){

        //分析得最小一个组合的数的取值范围为123到333,看的网上的,我可没有分析出来啊。智商不够    //用[m9]来装a,b,c得到数据    int m[9];    int copy,flag = 1;//flag 相等标记    for(int a=123; a<=333; a++){          int b = 2*a;        int c = 3*a;        //将abc个位,十位,百位分出来,这儿是倒序,不影响        for(int k= 0;k<3;k++){            switch(k) {                case 0:                     copy =a;break;                case 1:                    copy =b;break;                case 2:                    copy =c;break;            }             for(int i=0;i<3;i++){                if(i) copy = copy / 10;                m[i+3*k] = copy%10;            }        }        //排序,这儿可以不排序,直接看有没有相等        choise(&m[0],9);        //判断是否相等        for(int n= 0;n<8;n++){            if(m[n]== m[n+1]|| !m[n]) flag =0;        }        if(flag)  printf("%d %d %d\n",a,b,c);        flag = 1;    }

    }

  • 3、有编号1~n个灯泡,起初所有的灯都是灭的。有k个同学来按灯泡开关,如果灯是亮的,那么按过开关之后,灯会灭掉。如果灯是灭的,按过开关之后灯会亮。
    现在开始按开关。
    第1个同学,把所有的灯泡开关都按一次(按开关灯的编号: 1,2,3,……n)。
    第2个同学,隔一个灯按一次(按开关灯的编号: 2,4,6,……)。
    第3个同学,隔两个灯按一次(按开关灯的编号: 3,6,9,……)。求最后亮着的灯,输入n,k
    如输入7 3,输出1 5 6 7

    void switch_light(){

    for(int l = 0;l<1010;l++)    a[l] = 1;//memset(a,1,sizeof(a));//将编号全赋值为0,1表示开灯,-1表示关灯int n,k;//n<=k<=1000scanf("%d%d",&n,&k);for(int i =2;i<=k;i++){             //i控制第几个人    for(int j=1;j<=n;j++){          //j控制灯开关        if(j*i>n)break;        a[j*i] =a[j*i]  *(-1);    }}for(int m = 1;m<=n;m++){    if(a[m]==1) printf("%d\t",m);}

    }