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;
}