第一章 最簡單的問題和算法算法
一、 求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);