2个很有趣、耐思考的C语言算法

1.

输入10个整数,任意相邻的两个数不同,输出所有的递增,递减序列 

比如:

输入:1 5 9 8 12 21 3 0 -1 9 

输出:

1 5 9

9 8

8 12 21

21 3 0 -1

-1 9

实现代码如下:

# include <stdio.h>

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

    int nu[10];

    int i,j;

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

    {

        scanf("%d",&nu[j]);

    }

    printf("%d ",nu[0]);    //第一位先打印

    for(i=1;i<10-1;i++)

    {

        printf("%d ",nu[i]);

   /**从第二数起比较它的前一个数后后一位数,如果出现大于小于或小于大于就换行*/

        if(((nu[i]>nu[i-1]) && (nu[i]>nu[i+1])) || ((nu[i]<nu[i-1]) && (nu[i]<nu[i+1])))

        {

            printf(" ");           //每次进来都先打印

            printf("%d ",nu[i]);

        }

    }

    printf("%d ",nu[9]);           //最后一位后面再打印

  return 0; 

}

2.

输入10个整数,找出出现次数最多的数 (如果多个并列,则按数字出现顺序分别输出)

输入:1 5 27 33 24 1 27 18 19 20 

输出:

   1 27

实现代码如下:

# include <stdio.h>

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

    int nu[10];

    int bz[10];

    int i,j,k,l,m;

    int max;

    int flaga=1,flagb=0;

 /**输入十个数*/

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

    {

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

    }

 /**用一个数组记录每一个数出现的次数*/

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

    {

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

        {

            if(nu[j] == nu[k])

            {

                flaga++;

            }

        }

        bz[j]=flaga;

        flaga=1;

    }

 /**通过记录次数的数组找出出现次数最多的下标*/

    max=bz[0];

    for(l=1;l<10;l++)

    {

        if(max<bz[l])

        {

            max=bz[l];

            flagb=l;

        }

    }

 /**通过下标找出bz[]数组中最大的的数值,bz[]中最大的数值与bz[]每一个数值比较,相等证明出现的最大次数相同*/

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

    {

        if(bz[flagb] == bz[m])                  //最大次数与其它次数比较

        {

            printf("%d ",nu[m]);

        }

    }

 return 0;

}

原文地址:https://www.cnblogs.com/xiao-c-2016/p/5908777.html