基本算法

第一章  最簡單的問題和算法算法

一、  求N的N次方的最後三位數函數

    main(){排序

    int i,x,y,k=1;數學

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

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

        k=k*x%1000;基礎

        printf("%d",k);二進制

        }float

 

二、100!的末尾多少個零程序

    main(){

    int count=0,i;

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

        count++;

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

    }

    printf("%d",count);

    }

 

思考:修改程序中求因子5的數目的算法,使程序能夠求出任意N!的末尾有多少個零。

 

三、  將任意一整數轉換爲二進制形式

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

     }

 

四、  第一我的將魚分紅五份,把多餘的一條魚扔掉,拿走本身的一份,第二我的一樣將魚分紅五份。拿走本身的一份,依次下去,問共有多少魚?

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,這是過度保守的作法,能夠在進一步深刻分析題目的基礎上修改初值,增大試探的步長值,以減小試探次數。

 

五、  冒泡法排序函數

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

    }

 

六、  選擇法排序函數

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

        }

    }

 

七、  第一次賣出了所有金魚的一半加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)

 

八、甲乙丙三漁夫出海打漁,他們隨傳帶21只籮筐,當晚返回是,他們發現七筐裝滿了魚,還有七筐裝了半筐魚,另外七筐是空的,因爲他們沒有稱,經過目測,七個半框是相等的,七滿眶重量是相等的,若不將魚帶出來的前題下,怎樣將於和筐評分爲三份?

#include <stdio.h>

int a[3][3],count;

void main(){

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

 printf("Possible plans:\n");

 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\n",++count);

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

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

      }

    }

   }

  }

 }

}

思考題:宴會上數學家出了一道題:假定桌子上有3瓶酒,將每瓶酒分給幾我的喝,可是喝各瓶酒的人數是不同滴,不過其中有一我的喝了每一瓶中滴酒,且加起來恰好是一瓶,請問喝這3瓶酒的各有多少人?  (答案:喝酒三瓶灑的人分別爲2人、3人和6人)

 

第二章  整數趣題

九、一個天然數被8除餘1,所得的商被8除也餘1,再將第二次的商被8除後餘7,最後獲得一個商爲a。又知這個天然數被17除餘4,所得的商被17除餘15,最後獲得一個商是a的2倍。求這個天然數。

(答案:1993)

十、如何將其用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\n", a);

相關文章
相關標籤/搜索