c/c++中:如果只告诉了行,没告诉列,且每行的数据个数是不一样的___这种情况应该采用的输入数据的方法:(c/c++一次输入多行)

c/c++中:如果只告诉了行,没告诉列,且每行的数据个数是不一样的___这种情况应该采用的输入数据的方法:

实战出真章!!!我们通过一道例题来解决上述问题
AcWing 1204. 错误票据

/**输入格式
第一行包含整数 N,表示后面共有 N行数据。
接下来 N行,每行包含空格分开的若干个(不大于100个)正整数(不大于100000),每个整数代表一个ID号。
*/

/**输出格式
要求程序输出1行,含两个整数 m,n
其中,m表示断号ID, n表示重号ID。
*/

/**数据范围
1≤N≤100
*/

/**要求
因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。
你的任务是通过编程,找出断号的ID和重号的ID。
假设断号不可能发生在最大和最小号。
*/
#include <bits/stdc++.h>
using namespace std;
const int N =10010;/*接下来 N行,每行包含空格分开的若干个(不大于100个)=>最多一百行,每行最多一百个*/
int n;
int a[N];
int main()
{
    scanf("%d",&n);//n行
    
    //这个题的难点在于数据如何输入???
    //只告诉了行,没告诉列,每行的数据个数是不一样的
    //输入数据的方法:
    
    
    //方法一:
    /*int j = 0;
    string line;
    getline(cin, line); // 忽略掉第一行的回车 , 就是:先把输入n后,那个回车给他读了
    while (n -- )       //读n行
    {
        getline(cin, line);//把这行数据读到line中,这一行数据就会把刚才那个回车给覆盖掉 
        stringstream ssin(line);//将读到的数据放到ssin中 , 相当于是让ssin替代cin    (用到了#include<sstream>头文件)
        while (ssin >> a[j]) j ++ ;//只要从ssin中读到了数据,就j++,j是记录已读入的数据
    }*/
    
    
    //方法二:这个代码更好一些
    int j = 0;
    //j个数据 注:scanf读到文件结束符时会返回-1,而不是0。
    while( scanf("%d",&a[j++]) != -1)/*cout<<"a["<<j-1<<"]读入:"<<a[j-1]<<";"*/;
    //数据存放在a[]的[0,j-1]中  for(int i = 0 ; i < j ; i++)
    //这里有一个细节:最后的文件结束符也算一次,不过是输入失败罢了,所以j多加了一次,应该减掉
    j--;
    
    
    sort(a,a+j);//排序
    int res1 = 0,res2 = 0;
    
    for(int i=1;i<j;i++)//假设断号不可能发生在最大和最小号
    {
        if(a[i]==a[i-1])//重号
          res2=a[i];
        if(a[i] == a[i-1]+2)//断号
        {
          res1=a[i]-1;
        }
    }
    
    printf("%d %d\n",res1,res2);
    
    return 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、付费专栏及课程。

余额充值