• 基本算法


    第一章  最简单的问题和算法

    1、  求N的N次方的最后三位数

        main(){

        int i,x,y,k=1;

            scanf("%d %d",&x,&y);

            for(i=1;i<=y;i++)

            k=k*x%1000;

            printf("%d",k);

            }

    2、100!的末尾多少个零

        main(){

        int count=0,i;

        for(i=5;i<=100;i+=5){

            count++;

            if(!(i%25))count++;

        }

        printf("%d",count);

        }

    思考:修改程序中求因子5的数目的算法,使程序可以求出任意N!的末尾有多少个零。

    3、  将任意一整数转换为二进制形式

       printb(int x,int n){

           if(n>0){

           putchar('0'+((unsigned)(x&1<<(n-1))>>(n-1)));  //取第N-1位的二进制值,并打印出来

        printb(x,n-1);}

           }

      main(){

           int x;

           scanf("%d",&x);

           printb(x,sizeof(int)*8);

         }

    4、  第一个人将鱼分成五份,把多余的一条鱼扔掉,拿走自己的一份,第二个人同样将鱼分成五份。拿走自己的一份,依次下去,问共有多少鱼?

    main(){

        int i,n,x,flag=1;

        for(n=6;flag;n++){

            for(i=1,x=n;flag&&i<=5;i++)

              if((x-1)%5==0)x=x*4/5;

              else flag=0;

            if(flag)break;

            else flag=1;

            }

        printf("%d",n);

        }

         问题进一步讨论:程序采用试探法,试探的初值为6,每次试探的步长为1,这是过分保守的做法,可以在进一步深入分析题目的基础上修改初值,增大试探的步长值,以减少试探次数。

    5、  冒泡法排序函数

    bubble(int a[],int n){

        int i,j,k;

        for(i=1;i<n;i++)

        for(j=0;j<n-1;j++)

        if(a[j]>a[j+1])

        {k=a[j];a[j]=a[j+1];a[j+1]=k;}

        }

     

    6、  选择法排序函数

    sort(int a[],int n){

        int i,j,k,t;

        for(i=0;i<n-1;i++){

            k=i;

            for(j=i+1;j<n;j++)

            if(a[k]>a[j])k=j;

            if(k!=j)

              {t=a[i];a[i]=a[k];a[k]=t;}

            }

        }

     

    7、  第一次卖出了全部金鱼的一半加2分之一条金鱼;第二次卖出剩金鱼的三分之一加三分之一条金鱼;第三次卖出剩金鱼的四分之一加四分之一条金鱼;第四次卖出剩金鱼的五分之一加五分之一条金鱼,最后还剩11条。问原来有多少条金鱼?

     main(){

        int x,i,j,k=0;

        for(i=23;k==0;i+=2){

          for(j=1,x=i;j<=4&&x>=11;j++)

           if((x+1)%(j+1)==0)

             x-=(x+1)/(j+1);

           else break;

          if(x==11&&j==5){

           printf("%d",i);

           k=1;}

        }

       }

      思考题:父亲将2520个桔子分给六个儿子。分完后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子?   (答案:240  460  434  441  455  490)

     

    8、甲乙丙三渔夫出海打渔,他们随传带21只箩筐,当晚返回是,他们发现七筐装满了鱼,还有七筐装了半筐鱼,另外七筐是空的,由于他们没有称,通过目测,七个半框是相等的,七满眶重量是相等的,若不将鱼带出来的前题下,怎样将于和筐评分为三份?

    #include <stdio.h>

    int a[3][3],count;

    void main(){

     int i,j,k,m,n,flag;

     printf("Possible plans: ");

     for(i=0;i<=3;i++)    //第一个渔夫满筐数,不得超过3

     {a[0][0]=i;

      for(j=i;j<=3;j++)    //第二个渔夫满筐数,不超3

      {a[1][0]=j;

       if((a[2][0]=7-i-j)>3)continue;    //第三个渔夫满筐数,不超3

       if(a[2][0]<a[1][0])break;  //为了避免重复情况,假设第三个渔夫满筐数不少于前面的

       for(k=1;k<=5;k+=2)    //半筐数,一定为奇数,因为每人平均分3.5筐鱼

       {a[0][1]=k;

        for(m=1;m<7-i;m+=2)

        {a[1][1]=m;

         a[2][1]=7-k-m;

         for(flag=1,n=0;flag&&n<3;n++)

          if(a[n][0]+a[n][1]<7&&a[n][0]*2+a[n][1]==7)    //计算是否满足情况

           a[n][2]=7-a[n][0]-a[n][1];

          else flag=0;

          if(flag)    //满足情况则输出

          {printf("NO.%d       Full basket Semi--basket Empty ",++count);

           for(n=0;n<3;n++)

            printf("fisher %c: %d  %d   %d ",'A'+n,a[n][0],a[n][1],a[n][2]);

          }

        }

       }

      }

     }

    }

    思考题:宴会上数学家出了一道题:假定桌子上有3瓶酒,将每瓶酒分给几个人喝,但是喝各瓶酒的人数是不一样滴,不过其中有一个人喝了每一瓶中滴酒,且加起来刚好是一瓶,请问喝这3瓶酒的各有多少人?  (答案:喝酒三瓶洒的人分别为2人、3人和6人)

     

    第二章  整数趣题

    9、一个自然数被8除余1,所得的商被8除也余1,再将第二次的商被8除后余7,最后得到一个商为a。又知这个自然数被17除余4,所得的商被17除余15,最后得到一个商是a的2倍。求这个自然数。

    (答案:1993)

    10、如何将其用switch进行表达?

    if(n<=5)

     a=0.35;

    else if(n>=20)

     a=0.85;

        else

         a=1.25;

     

    #include <stdio.h>

    int main(void)

    {

        int i,j,n;

        float a;

        scanf("%d", &n);

        i = n <= 5;

        j = n >= 20;

        switch (i * 10 + j)

        {

            case 10 : a = 0.35; break;

            case 1  : a = 0.85; break;

            default : a = 1.25; break;

        }

        printf("%f ", a);

  • 相关阅读:
    【面向对象-天龙八部】
    【面向对象-作业】
    【OOP】面向对象的程序开发
    nmcli命令详解(创建热点,连接wifi,管理连接等)
    构造函数&&继承8.1
    Set集合之TreeSet类
    Set集合之HashSet类
    HDFS上传数据的流程
    zookeeper的安装与配置
    hive介绍、安装配置、表操作基础知识适合小白学习
  • 原文地址:https://www.cnblogs.com/zhangwang/p/11186699.html
Copyright © 2020-2023  润新知