基本算法

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

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);

原文地址:https://www.cnblogs.com/zhangwang/p/11186699.html