典题

都是自己写的,如果代码有不好的地方,望请指出,哥只是一个小菜。这里将收集我自己觉得需要花点脑经的题目。题目会不断的累加,以便自己不断的积累编程经验和编程的一些技巧和思想。

 

1.实现一个函数,传递一个整形参数,如果这个整数可以分解成连续的自然数相加,则把所有的可能输出,否则,输出无法分解。
例如:
输入:15
输出:
15 = 1+2+3+4+5
15 = 4+5+6
15 = 7+8
输入:4
输出:无法分解

 

哥的源码:

 

#include <stdio.h>

void func(n)

{

    int i;

    int j;

    int sums;

    int flag =0;

    int k;

    int show =0;

    for(i=1;i <= n/2;i++)

    {

        flag = 0;

        sums =0;

        for(j=i;j <= n/2+1;j++)

        {

            sums += j;

            if(sums==n)

            {

                flag =1;

                show =1;

                break;

            }

            

        }

        if(flag ==1)

        {

            printf("%d=",n);

            for(k=i;k<=j;k++)

            {

                printf("%d",k);

                if(k<j)printf("+");

            }

            printf("\n");

            

        }

        

    }

    if(show==0)

      printf("无法分解");

}

int main(void)

{

    int n;

    scanf("%d",&n);

    

    func(n);

    

    return 0;

}

2.实现一个函数,传递一个整数参数,返回这个整数参数的阶乘的末尾有多少个0,并在main函数里输出。
例如:
输入:9
输出:1
输入:3
输出:0
输入:788
输出:195

 

哥的源码:

/*#include <stdio.h>

#include <math.h>

int sum(int n)

{

    int i=0;

    int j=0;

    int s=0;

    int b =n;

    while(n>=5)

    {

        n /= 5;

        i++;

    }

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

    {

        s += b/pow(5,j);

    }

    return s;

}

 

int main(void)

{

    int n;

    scanf("%d",&n);

    printf("%d",sum(n));

    return 0;

}*/

 

 

3.  输入两个数,第一个数决定一个nXn的矩阵,第二个数决定从1开始赋值,赋值的上限 
比如:
输入:5 18 
输出:
1 2 3 4 5
16 17 18 0 6 
15 0 0 0 7
14 0 0 0 8
13 12 11 10 9

输入: 4 12 
输出:
1 2 3 4
12 0 0 5
11 0 0 6
10 9 8 7

 

哥写的源码:

#include <stdio.h>

int main(int argc, const char * argv[])

{

 

    int n, m;

    

    int arr[20][20];

    

    scanf("%d%d",&n,&m);

    

    int j;

    int i;

    int rdes = n;

    int ddes = n;

    int ldes = 0;

    int udes = 1;  // 赋值方向

    

    int type = 1;

    

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

    {

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

        {

           arr[i][j]= 0;

        }

    }

 

    i=1;

    while(i <= m)

    {

       

        switch(type)

        {

            case 1: // 向右

                for(j=ldes; j<rdes; j++,i++)//0-5

                {

                    arr[ldes][j] = i; // 赋值

                    if(i==m)

                    {

                        i++;

                        break;

                    }

                }

                type = 2;

                rdes--;  //4

                break;

            case 2: // 向下

                for(j=udes; j<ddes; j++,i++)  //1-5

                {

                    arr[j][rdes] = i;

                    if(i==m)

                    {

                        i++;

                        break;

                    }

 

                }

                type = 3;

                ddes --;  //4

                break;

            case 3:  // 向左

                for (j=rdes-1; j>=ldes; j--,i++)

                {

                    arr[rdes][j] = i;

                    if(i == m)

                    {

                        i++;

                        break;

                    }

                }

                type = 4;

                ldes++;

                break;

            case 4:  // 向上

                for (j=ddes-1; j>=udes; j--,i++)

                {

                    arr[j][ldes-1] = i;

                    if(i == m)

                    {

                        i++;

                        break;

                    }

                }

                type = 1;

                udes++;

                break;

        }

    }

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

    {

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

        {

            printf("%5d",arr[i][j]);

        }

        printf("\n");

    }

    

    return 0;

}

 

4. 输入十个数,任意相邻的两个数不同,输出所有的递增,递减序列 
比如:
输入:1 5 9 8 12 21 3 0 -1 9 
输出:
1 5 9
9 8
8 12 21
21 3 0 -1
-1 9

输入: 3 9 8 -11 4 21 8 -3 0 2 
输出:
3 9
9 8 -11 
-11 4 21
21 8 -3
-3 0 2

哥写的源码:

#include <stdio.h>

 

int main(void)

{

    int a[11] ={0};

    int i;

    int j=0;

    for (i = 0; i < 10; i++)

    {

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

    }

    int flag =1;

    int k = 0;

    for (i=1; i<=9; i++) {

        if((a[i-1]<a[i]&&a[i]>a[i+1])||(a[i-1]>a[i]&&a[i]<a[i+1])|| i==9)

        {

            flag = 0;

            j = i;

        }

        if(flag == 0)

        {

            for( ;k<=j;k++)

            {

                printf("%d ",a[k]);

            }

            printf("\n");

            k = j;

            flag = 1;

        }

        

    }

    return 0;

}

 

posted @ 2014-07-26 16:36  OHeroJ  阅读(331)  评论(0编辑  收藏  举报