标题:求解思路
只看楼主
bcbbcclbbc
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:194
专家分:528
注 册:2019-8-15
结帖率:100%
已结贴  问题点数:20 回复次数:7 
求解思路
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
搜索更多相关主题的帖子: 输入 输出 序列 整数 思路 
2019-11-02 06:28
Mr_doge
Rank: 5Rank: 5
等 级:贵宾
威 望:10
帖 子:159
专家分:385
注 册:2018-6-28
得分:7 
最简单最暴力的办法

除原数组,新建10个缓冲数组
取数字并存入一个缓冲数组,一旦递增、递减的状态出现变化则切换接收数字的缓冲数组
逐行打印缓冲数组
2019-11-02 08:17
bcbbcclbbc
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:194
专家分:528
注 册:2019-8-15
得分:0 
回复 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编辑过]

2019-11-03 05:21
bcbbcclbbc
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:194
专家分:528
注 册:2019-8-15
得分:0 
程序如下:
#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;
}
2019-11-03 05:23
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:7 
程序代码:
#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;
}
收到的鲜花
  • bcbbcclbbc2019-11-09 16:00 送鲜花  5朵  
2019-11-04 09:20
bcbbcclbbc
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:194
专家分:528
注 册:2019-8-15
得分:0 
回复 5楼 rjsp
多谢大佬指点。
厉害了,条理很清晰,就是这个程序的逻辑我有点似懂非懂,
判断子序列的循环和之前的一个程序有点相似:  在输入几行字符中,程序运行只取每行的第一个字符。
得好好消化一下。
多谢!
2019-11-04 11:41
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
得分:6 
程序代码:
#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]);
        }
    }
}
收到的鲜花
  • bcbbcclbbc2019-11-09 16:00 送鲜花  5朵  
2019-11-04 14:36
bcbbcclbbc
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:194
专家分:528
注 册:2019-8-15
得分:0 
回复 7楼 自学的数学
特别感谢,原谅我还在算法底层转溜
好好学习,天天向上。每天都能学到一点
2019-11-04 16:43



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-497562-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.240110 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved