C语言趣味题

问题 A: 趣味程序设计_狼追兔子

时间限制: 1 Sec  内存限制: 128 MB
提交: 341  解决: 63
[提交][状态][讨论版]

题目描述

一只兔子躲进了n个环形分布的洞的某一个中。狼在第一个洞没有找到兔子,就隔一个洞,到第三个洞去找;也没有找到,就隔两个洞,到第六个洞去找。以后每次多一个洞去找兔子……这样下去,如果一直找不到兔子,请问兔子可能在哪个洞中?

输入

有多组测试数据,读取到文件结尾符为止。每组测试数据输入n(2≤n≤100),即洞穴个数。输入到文件结尾符为止。

输出

兔子可能藏匿的洞。如果不止一个,按从小到大的顺序输出。如果不存在,输出空行。

样例输入

10
8
15

样例输出

2 4 7 9
 
2 4 5 7 8 9 11 12 14

提示

用一个数组a[10],对应的元素a[0],a[1],a[2]……a[9]对应表示10个洞,初值均置1。通过一个循环用“穷举法”找兔子,第n次查找对应第(n-1)%10个洞,如果在第(n-1)%10个洞中没有找到兔子,因此将数组元素a[(n-1)%10]置0值。循环完成后,检查a数组各元素(各个洞)的值,若其值仍为1,则兔子可能藏身该洞中。

#include

#include

int ok[110];

int main()

{

    int n,s,i,find;

    while(scanf("%d",&n)!=EOF)

    {

        memset(ok,0,sizeof(ok));

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

            if(!ok[find=(i*(i+1)/2)%n])

                if(find==0)

                    ok[n]=1;

                else

                    ok[find]=1;

        for(s=0,i=1;i<=n;i++)

            s+=ok[i];

        for(i=1,find=0;i<=n;i++)

            if(!ok[i])

            {

                if(find!=(n-s-1))

                {

                    printf("%d",i);find++;

                }

                else

                    printf("%d",i);

            }

        printf("\n");

    }

    return 0;

}

 

 

 

问题 B: 趣味程序设计_巧夺偶数

时间限制: 1 Sec  内存限制: 128 MB
提交: 174  解决: 73
[提交][状态][讨论版]

题目描述

桌子上有25颗棋子。游戏双方轮流取子,每人每次最少取走一颗棋子,最多可取走3颗棋子。双方照这样取下去,直到取光所有的棋子。于是双方手中必然一方为偶数,一方为奇数,偶数方为胜者。请编程实现人机游戏。人先走,计算机后走。若游戏结束,则输出“Gameover!”。

输入

输入人取走棋子的个数。输入一次,按一次回车。游戏不止一轮。按下文件结尾符,退出游戏。必须在完成一轮后退出游戏。不得中途退出游戏。

输出

输出计算机取走的个数,每次输出最优解。

样例输入

1
1
1
1
1
1
1
2
1
3
2
1
3
1

样例输出

3
3
3
3
3
3
Game over!
2
3
1
2
3
1
Game over!

 

 

#include

int main()

{

    int n,sum=25;

    loop:

    while(scanf("%d",&n)!=EOF)

    {

        sum-=n; 

        if(sum==1)

        {

            printf("1\nGameover!\n");

            sum=25;

            gotoloop;

        if(sum==3||sum==2)

        {

            printf("1\n");

            sum--;          

        }

      

        }

        else

        {   

            if(sum<=0)

            {       

                printf("Gameover!\n");

                sum=25;

                gotoloop;

            }       

            else

            {

                printf("%d\n",4-n);         

                if(n==1)

                   sum-=3;

                if(n==2)

                   sum-=2;

                if(n==3)

                   sum-=1;

            }

        }

    }

    return 0;

}

 

 

问题 C: 趣味程序设计_五猴分桃

时间限制: 1 Sec  内存限制: 128 MB
提交: 186  解决: 102
[提交][状态][讨论版]

题目描述

5只猴子一起摘了1堆桃子。因为太累了,它们商量决定,先睡一觉再分。过了不知多久,1只猴子来了。它见别的猴子没来,便将这1堆桃子平均分成5份,结果多了1个,就将多的这个吃了,拿走其中的1堆。又过了不知多久,第2只猴子来了。它不知道有1个同伴已经来过,还以为自己是第1个到的呢。于是将地上的桃子堆起来,平均分成5份,发现也多了1个,同样吃了这1个,拿走其中的1堆。第3只、第4只、第5只猴子都是这样……问这5只猴子至少摘了多少个桃子?第5个猴子走后还剩下多少个桃子?

输入

输出

输出5只猴子至少摘了多少个桃子,第5个猴子走后还剩下多少个桃子。中间用空格隔开。

样例输入

样例输出

3121 1020

提示

思路一:“分”——假设至少摘了first_num个桃子,则令first_num=6,7,8,9,10,……这样不断的试,如果那个数能按规则(first_num=(first_num-1)/5*4)被5只猴子顺利的吃1个并分5组,则为所求。思路二:“凑”——假设最后剩下last_num个桃子,则令last_num=4,5,6,7,8,9,10,……这样不断的试,如果那个数能按规则(last_num%4==0则last_num= last_num / 4 * 5 + 1)凑5次,则为所求。

 

 

 

#include

#include

int main()

{

    int first,i,t;

    for(i=1;i<5000;i+=5)

    {

        first=i;

        for(t=1;t<=5;t++)

        {

            if(first%5==1)

            {

                first=(first-1)/5*4;

                if(t==5)

                    printf("%d%d\n",i,first);

            }

            else

                break;

        }       

    }

//  printf("time:%.2lf\n",(double)clock()/ CLOCKS_PER_SEC);

    return 0;

}

 

 

问题 D: 趣味程序设计_高次方数

时间限制: 1 Sec  内存限制: 128 MB
提交: 559  解决: 80
[提交][状态][讨论版]

题目描述

求13的n次方(12

输入

有多组测试数据,每组测试数据一行,即整数n。以文件结尾符结束。

输出

输出13的n次方的最后三位数

样例输入

13
20

样例输出

253
801

提示

64位整型用long long 表示,格式串为"%lld"

#include

int fun(long long n)

{

    int k=13,t=1;

    while(n>0)

    {

        if(n%2==1)

            t=t*k%1000;

        k=k*k%1000;

        n>>=1;

    }

    return t;

}

int main()

{

    long long n;

    while(scanf("%lld",&n)!=EOF)

        printf("%03d\n",fun(n));

    return 0;

}

 

问题 E: 趣味程序设计_借书方案

时间限制: 1 Sec  内存限制: 128 MB
提交: 429  解决: 154
[提交][状态][讨论版]

题目描述

小明有n本新书,要借给A、B、C三位小朋友。只借一次。若每人每次只能借一本,则可以有多少种不同的借法?

输入

有多组测试数据,输入整数n (5≤n≤1000),输入到文件结尾符为止。

输出

借法总数。

样例输入

5
6
7
8

样例输出

60
120
210
336
 
 

#include

int main()

{

    long long n;

    while(scanf("%lld",&n)!=EOF)

        printf("%lld\n",n*(n-1)*(n-2));

    return 0;

}

 

 

 

问题 F: 趣味程序设计_过桥问题

时间限制: 1 Sec  内存限制: 128 MB
提交: 102  解决: 19
[提交][状态][讨论版]

题目描述

过桥问题。有N(N≥2)个人在晚上需要从X地到达Y地,中间要过一座桥,过桥需要手电筒(而他们只有1个手电筒),每次最多两个人一起过桥(否则桥会垮)。N个人的过桥时间依次存入数组t[N]中,分别为:t[0], t[1], ……, t[N-1]。过桥的速度以慢的人为准!注意:手电筒不能丢过桥!问题是:编程求这N个人过桥所花的最短时间。

输入

有多组测试数据,

每组数据先输入一个人数N,然后输入这N个人过桥所花的时间。

输出

输出对应的最短时间。

样例输入

4 1 2 5 10
4 5 2 10 1

样例输出

17
17

 

#include

void fun(int *a,int n)

{

    int i,j,t,k;

    for(i=0;i

    {

        k=i;

        for(j=i+1;j

        {

            if(a[j]

                k=j;

        }

        if(i!=k)

        {

             t=a[i];

             a[i]=a[k];

             a[k]=t;

        }

    }

}

int main()

{

    int a[100],i,n,time,k;

    while(scanf("%d",&n)!=EOF)

    {

        time=0;

        for(i=0;i

            scanf("%d",&a[i]);

        fun(a,n);

        k=n-1;

        while(1)

        {

            if(k<=2)

            {

            if(k==0)

                time+=a[0];

            if(k==1)

                time+=a[1];

            if(k==2)

                time+=(a[0]+a[1]+a[2]);

            printf("%d\n",time);

            break;

            }

            else

            {

                if(2*a[1]>=a[0]+a[k])

                    time+=(2*a[0]+a[k-1]+a[k]);

                if(2*a[1]

                    time+=(a[0]+2*a[1]+a[k]);

                k-=2;

            }

        }

    }

    return 0;

}

 

 

问题 G: 趣味程序设计_数制转换

时间限制: 1 Sec  内存限制: 128 MB
提交: 265  解决: 110
[提交][状态][讨论版]

题目描述

将任一整数转换为二进制数形式并输出。

输入

有多行数据,每行输入一十进制数字n(1≤n≤2147483647)。输入到文件结尾符为止。

输出

输出n的二进制表示

样例输入

1
2
3
4
5
6
7

样例输出

1
10
11
100
101
110
111

 

 

#include

#include

void f(long long num)

{

    if (num)

    {

        f(num/2); 

        printf("%lld",num % 2);

    }

}

int main(void)

{       

    long long num;  

    while (scanf("%lld",&num) != EOF)

    {

        f(num);

        putchar('\n');

    }   

    return 0;

}

 

 

问题 H: 趣味程序设计_打渔晒网

时间限制: 1 Sec  内存限制: 128 MB
提交: 205  解决: 28
[提交][状态][讨论版]

题目描述

中国有名俗语叫“三天打鱼两天晒网”。小强从2000年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是在“打鱼”,还是在“晒网”?

输入

输入日期,格式是yyyy-mm-dd,例如2012-01-23。输入到文件结尾符为止。

输出

如果小强在打鱼,那么输出“He is fishing.”。如果小强子在晒网,那么输出“Heis drying nets.”

样例输入

2000-01-01
2000-01-05

样例输出

He is fishing.
He is drying nets.

 


你可能感兴趣的:(练习题,C)