注册 登录
编程论坛 C语言论坛

求解思路

bcbbcclbbc 发布于 2019-11-02 06:28, 2432 次点击
1048: 【基础】求序列中所有递增或递减子序列的个数并输出子序列。
题目描述
输入一个由10个整数组成的序列,其中序列中任意连续三个整数都互不相同,求该序列中所有递增或递减子序列的个数。

输入
输入只有一行,包括10个整数。之间用一个空格分开。

输出
输出的第一行,包括1个整数n.后面跟着n行.

样例输入
1 10 8 5 9 3 2 6 7 4

样例输出
6
1 10 
10 8 5 
5 9
9 3 2
2 6 7
7 4
7 回复
#2
Mr_doge2019-11-02 08:17
最简单最暴力的办法

除原数组,新建10个缓冲数组
取数字并存入一个缓冲数组,一旦递增、递减的状态出现变化则切换接收数字的缓冲数组
逐行打印缓冲数组
#3
bcbbcclbbc2019-11-03 05:21
回复 2楼 Mr_doge
除原数组,新建10个缓冲数组
取数字并存入一个缓冲数组,一旦递增、递减的状态出现变化则切换接收数字的缓冲数组

新建10个数组,这个量有点大,而且不太好调用。
typedef int A[N+1];
A a1={1},a2={1},a3={1},a4={1},a5={1},a6={1},a7={1},a8={1},a9={1},a10={1};

我直接定义了一个二维数组。


[此贴子已经被作者于2019-11-3 05:44编辑过]

#4
bcbbcclbbc2019-11-03 05:23
程序如下:
#include<stdio.h>
#define N 10
int main()
{
    int i,j,k;
    int n,m;            
    int a[N]={0};
    int b[N][N+1]={0};
   
    for(i=0;i<10;i++) scanf("%d",&a[i]);   
   
    for(i=0,k=0;k<N-1;i++)
    {
        j=1;
        b[i][0]=1;          //数组第一个元素为标志位(输出多少个元素);
        b[i][j]=a[k];
        n=m=a[k]>a[k+1]?1:0;   
        
        while(k<N-1)
        {
            b[i][0]++;
            b[i][++j]=a[++k];
            m=a[k]>a[k+1]?1:0;
            if(n!=m) break;       //若m与n的值相同,为一组 递增/递减 序列,继续循环.
        }
    }
    k=i;
    printf("%d\n",k);
    for(i=0;i<k;i++)
    {
    for(j=1;j<=b[i][0];j++)
    printf("%d ",b[i][j]);
    printf("\n");
    }
    return 0;
}
#5
rjsp2019-11-04 09:20
程序代码:
#include <stdio.h>

int main( void )
{
    // 输入 10个整数
    int a[10];
    for( size_t i=0; i!=sizeof(a)/sizeof(*a); ++i )
        scanf( "%d", &a[i] );

    // 求 子序列的个数
    {
        unsigned count = 0;
        int s = 0; // +表示增,-表示减
        for( size_t i=1; i!=sizeof(a)/sizeof(*a); ++i )
        {
            if( a[i]>a[i-1] && s<=0 )
            {
                s = +1;
                ++count;
            }
            else if( a[i]<a[i-1] && s>=0 )
            {
                s = -1;
                ++count;
            }
        }
        printf( "%u", count );
    }

    // 输出 所有子序列
    {
        int s = 0; // +表示增,-表示减
        for( size_t i=1; i!=sizeof(a)/sizeof(*a); ++i )
        {
            if( a[i]>a[i-1] && s<=0 )
            {
                s = +1;
                printf( "\n%d", a[i-1] );
            }
            else if( a[i]<a[i-1] && s>=0 )
            {
                s = -1;
                printf( "\n%d", a[i-1] );
            }

            printf( " %d", a[i] );
        }
        printf( "\n" );
    }

    return 0;
}
#6
bcbbcclbbc2019-11-04 11:41
回复 5楼 rjsp
多谢大佬指点。
厉害了,条理很清晰,就是这个程序的逻辑我有点似懂非懂,
判断子序列的循环和之前的一个程序有点相似:  在输入几行字符中,程序运行只取每行的第一个字符。
得好好消化一下。
多谢!
#7
自学的数学2019-11-04 14:36
程序代码:
#include <stdio.h>
int main()
{
    int i, t = -1, A[10];
    for(i=0; i<10; ++i)
        scanf("%d", &A[i]);
        
    for(i=1; i<10; ++i)
    {
        if(t == (A[i]>A[i-1]))
            printf(" %d", A[i]);
        else    //新序列
        {
            t = (A[i]>A[i-1]);
            printf("\n%d %d", A[i-1], A[i]);
        }
    }
}
#8
bcbbcclbbc2019-11-04 16:43
回复 7楼 自学的数学
特别感谢,原谅我还在算法底层转溜
好好学习,天天向上。每天都能学到一点
1