转换上课周次字符串(我带着困惑我一周之久的编程题来了)

目录

1.0【问题描述】

2.0顺顺思路

3.0上代码

4.0乱总结


1.0【问题描述】

将某课程上课周次转换为课表显示形式。从键盘录入上课周次,将其输出为逗号分隔的字符串,将连续周次合并为 x-y的形式。


【输入形式】

总共输入1行,其为空格分隔的自然数数列,输入必须从小到大排列,用-1表示输入结束。


【输出形式】

只输出1行。不连续的周次之间用英文逗号“,”分开,连续的周次之间用英文横线“-”连接起止周


【样例输入1】

1 2 3 4 5 6 -1


【样例输出1】

1-6

【样例输入2】

1 3 4 5 6 8 9 10 12 13 14 16 18 -1


【样例输出2】

1,3-6,8-10,12-14,16,18

【样例输入3】

3 -1


【样例输出3】

3

2.0顺顺思路

可以用一个循环,来判断每次输入的数,是不是前者+1,是不是等于-1;输出放循环里,每次循环后只要判断的这个数不为-1;都要输出“,” (看不懂的话,就去看代码的注释,我实在是描述不好 语文太拉了(狗头))

3.0上代码

/*#include<iostream>
using namespace std;

int main()
{
	int left = -100, right = -100,rec;    //至于为啥初值设-100,别问,问就是随便设的,只要是非自然数就行
	while(1)
	{
		cin >> rec;               //循环输入 对输入的每个数进行判断
		if (rec == right + 1) {
			right = rec;           //如果是前者的+1,就更新right
		}
		else
		{
			if (left >= 0)
			{
				if (left == right)
				{
					cout << left;
				}
				else
				{
					cout << left << "-" << right;
				}
				if (rec != -1) cout << ',';
			}
			
			left = rec;    //重新使left==right  准备下一次循环
			right = rec;
		}
		if (rec == -1) break;      //如果输入的数是-1,就结束循环
	}
	return 0; 

另一种解法是用数组,由于数组我只是看了教材,可以说很废,不是很会用(所以我求助了我的同学(万能[狗头]))

#include <iostream>
using namespace std;
int main()
{
    int a[100];
    int i=0;
    int x=0 , y ;
    do
    {
        cin>>a[i];            //输入数组
        i++;
    }   while(a[i-1]!= -1 );
    for(y=1;y<i;y++)
    {
       if(a[y]-a[y-1]==1) 
	   continue;              //如果等于前者加1,就跳出循环,进入下一次循环
       else {
                if(a[x]==a[y-1])
                {
                    cout<<a[x];        //如果后者不为前者加1,就把前者扔进一个新的数组
                    x=y;             //更新左界
                }
                else
                {
                    cout<<a[x]<<'-'<<a[y-1];
                    x=y;                 //更新左界
                }
                if (a[x] != -1) 
				cout << ',';
            }
    }
    return 0;
}

4.0乱总结

其实数组和循环的解法差不多,本质上都是一样的,主要是要抓住左右界,这道题冒貌似还有更简单的解法,不过涉及到很后面的知识 等我学会后回来更新

自我感觉这篇文章讲得不是很通透,但我实在不知道该怎么进一步讲了,如果看不明白的话给我留言(我给讲),也欢迎大家指正

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欧帝想飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值