第一章 最简单的问题和算法
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:\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人)
第二章 整数趣题
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\n", a);