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

时间:2021-02-21 17:28:21

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("\n");           //每次进来都先打印

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

}

}

printf("%d\n",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;

}