牛客输入输出

#include<bits/stdc++.h>
using namespace std;

int main(){
	vector<int>nums1;  vector<int>nums2;
    string s;    
    getline(cin,s);
    stringstream ss;
    ss<<s;
    string temp;
    while(getline(ss,temp,' '))
        nums1.push_back(stoi(temp));
  	这里就是每次要重新定义  stringstream  就是stringstrem 第一次给他赋值 ok 第二次赋值就会失效 啥都没有了!!!! 重新定义 
  	
    getline(cin,s);
    stringstream ss2(s);
    while(getline(ss2,temp,' '))
        nums2.push_back(stoi(temp));
    //完成输入,进入算法
    int m=nums1.size(); int n=nums2.size();
    vector<int>res(m+n);
    int index=0,i=0,j=0;
    while(i<m && j<n){
        if(nums1[i]<=nums2[j]){
            res[index++]=nums1[i++];
        }
        else
            res[index++]=nums2[j++];
        }
        for(;i<m;)
            res[index++]=nums1[i++];
        for(;j<n;)
            res[index++]=nums2[j++];
        //

    ///输出
    for(int k=0;k<res.size();k++){
        cout<<res[k]<<' ';
    }
    
    
}
#include<bits/stdc++.h>
using namespace std;
int main(){
	int N,M;
	cin>>N>>M;
	cin.get(); //cin 输入中 回车不会吃掉 只是终止 getline 遇到回车就完犊子了 终止了,所以必须cin.get() 
	vector<vector<float> >res;
	for(int i=0;i<N;i++){
		string s;
		getline(cin,s);
		stringstream ss(s);
		string temp;
		vector<float>v;
		while(getline(ss,temp,' ')){
			v.push_back(stof(temp));
		}
		res.push_back(v);
	}
	
	 cout<<res[1][2];
} 

题目1: 输入第一行表示几个行,接下来每行2个数字,输出累加

#include<iostream>
using namespace std;

int main()
{
    int n,a,b;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a>>b;
        cout<<a+b<<endl;
    }
        
    return 0;
}

假设我们知道要输入比如N行4列,是空格隔开的,我们可以用:

#include<iostream>
#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n,a,b,c,d;
    cin>>n;
    vector<vector<int>>nums(n,vector<int>(2));
    for(int i=0;i<n;i++)
    {
        cin>>a>>b>>c>>d;
        nums[i].push_back(a);
        nums[i].push_back(b);
        nums[i].push_back(c);
        nums[i].push_back(d);
        cout<<a+b<<endl;
    }
        
    return 0;
}

注意到 while(cin>>a>>b)中,一直跳不出去,所以最多执行while里面额程序,而c=getchar()!=’\n’是可以跳出去的,getline也跳不出去 反正记住就行!
 注意到cin>>a>>b或者连续两行的cin都是没事的,但是cin.get(ch),ch只能是char或者ch=cin.get(),当cin之后用回车,回车存在缓存区,cin.get时候会被终止因此忽略,所以要用cin.get()或者cin.ignore()来忽略吃掉这个回车.对cin来说回车就是停止吃的过程然后存入缓存区,但是再次吃的时候是缓存区不管,他是忽略回车的! 总之 循环的时候还是啥的不要用getchar 问题很大 就cin好了或者知道个数的话就for循环。不知道个数的话getline while起来,退不出去看题目给什么条件能break
  说白了就是getline 或者cin的for循环!

题目2:A+B输出4
在这里插入图片描述
代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int count;
    int res;
    int sum=0;
    while(cin>>count){
        if(count==0)
            break;
        for(int i=0;i<count;i++){
            cin>>res;
            sum+=res;
        }
        cout<<sum<<endl;
        sum=0;
    }
    return 0;
}

while(cin>>n)这种少用,除非有break的。这边显示如何跳出去的。

A+B输出5
在这里插入图片描述

#include<iostream>
#include<vector>
using namespace std;

int main()
{
	vector<int>res;
    int linecount = 0;
    cin>>linecount;
    while(linecount>0)
    {
        int numcount = 0;
        cin>>numcount;
        int sum  = 0;
        for(int i = 0; i < numcount;i++)
        {
            int num = 0;
            cin >> num;
            sum += num;
        }
        res.push_back(sum);
        linecount--;
    }
    
	for (auto i : res)
	{
		cout << i << endl;
	}
	return 0;
}

牛客输入输出6经典!:
在这里插入图片描述

#include<iostream>
#include<string>
#include<vector>
#include<cstring>
#include<sstream>
#include<numeric>
using namespace std;
int main()
{
    string str;
    vector<vector<int>>res;
    vector<int> ans;
    while(getline(cin,str))
    {   
        if(str.empty())
            break;
        ans.clear();
        string temp;
        stringstream ss(str);
        while(getline(ss,temp,' '))//没有默认参数或者加空格就是ss输出给temp遇到空格就结束,结束输入,但是geiline还在因为这里不是cin,所以就一行getline完毕就结束了。
        {
            ans.push_back(stoi(temp));
        }
        res.push_back(ans); //res 是为了造出2维数组,用 stringstream来用于split很方便  
        cout<<accumulate(ans.begin()+1,ans.end(),0)<<endl;
    }
    return 0;
}

注意到,对 while(getline(ss,temp,’ '))中的第三个参数设置,或者;就能实现以这个为分界线对任意行信息进行读取了!!!不用调用子函数,而且读取是不断读取的!!记住 直到行数可以for循环,每个for进行getline,注意到这个框架有2个getline,第一次是cin进去,第二次的gerline只是为了让stringstream获得哪一行数据
注意到
  https://www.cnblogs.com/zhang-qc/p/9048977.html
  https://blog.csdn.net/liitdar/article/details/82598039
  讲解了sstream的用法,可以看看。简单概括就是stringstream 用>>输出元素给别人,<<给他赋值元素,ss.clear():ss.str(xx)是比较场用的组合。 ss.clear()用来清空当两次赋值对象类型不同时,ss.str(“”)不加参数加双引号就是字符串的清空,两次赋值对象都是字符串。ss.str()用来表示ss的全部值,输出的时候用。
  注意到streamstring 类型他有个if (ss.fail()),一般用来判断是否走完,我们用上面的while可以实现,但是一些特殊场合,如下代码所示,可见streamstring具备自动识别的功能,可以看到str字符串形式输入给ss后他输出的时候具备自动转换的功能,我输出给temp和ch他会自动根据数据进行转换!如果没有那就是按照空格走了。但是如果使用getline(ss,temp,’ ')只能转换为字符串形式~
  还有个就是每次走完一个小段ss相当于就前进这一段,空格也删掉。正常输出3次,但是这个程序会输出4次,最后一次重复,这是由于反正ss最后一次了,他还会输出下上次缓存的区域,但是此时fail标志位必须等走完才true,所以就能读,所以在读之后再判断fail,
  总结就是,fail是第四次读的时候遇到失败了,才开始变质,但是还是企图读,所以强行从上次缓存区读取了。fail不是自动fail的,是检测读取是否fail操作。

int main() { 
    stringstream ss; 
    string str; 
    str = "999:97 42:22 44:102300"; 
    ss << str; 
    char ch; 
    int temp, temp1; 
    while (1) { 
     if (ss.fail()) { 
    break; 
    } 
    ss >> temp >> ch >> temp1; 
    cout << temp << ":" << temp1 << endl; 
    } 
    return 0; 
} 


输出:
999:97 
42:22 
44:102300 
44:102300

程序修改为:

#include<iostream>
#include<string>
#include<vector>
#include<cstring>
#include<sstream>
#include<numeric>
using namespace std;
int main() { 
    stringstream ss; 
    string str; 
    str = "999:97 42:22 44:102300"; 
    ss << str; 
    char ch; 
    int temp, temp1; 
    while (1) { 
    
    ss >> temp >> ch >> temp1; 
     if (ss.fail()) { 
   		 break; 
    } 
    cout << temp << ":" << temp1 << endl; 
    } 
    return 0; 
}
/
输出:
999:97 
42:22 
44:102300  

或者改成这样也是对的:,为什么放到while循环就对了呢?这是由于读都是可以读N+1次,但是第N+1次是强行读的,在while的执行中出现了不一样的操作,是缓存区出来的,所以会终止的。

#include<iostream>
#include<string>
#include<vector>
#include<cstring>
#include<sstream>
#include<numeric>
using namespace std;
int main() 
{ 
    stringstream ss; 
    string str; 
    str = "999:97 42:22 44:102300"; 
    ss << str; 
    char ch; 
    int temp, temp1; 
    while (ss >> temp >> ch >> temp1) 
    { 
     cout << temp << ":" << temp1 << endl; 
    } 
    cin.ignore(); 
    return 0;
} 

或者用我的老办法就是:

#include<bits/stdc++.h>
using namespace std;
vector<int> helper(string s);
int main(){
    int n;
    string s;
    vector<int> nums;
    vector<vector<int>> ans;
    while(getline(cin,s)){  
        if(s=="")
            break;
        nums.clear();
        nums=helper(s);
        ans.push_back(nums);
        cout<<accumulate(nums.begin()+1,nums.end(),0)<<endl;   
    } 
    return 0;
}
 vector<int> helper(string s){
     string temp;
     vector<int>res;
     for(int i=0; i<s.size();i++){
         if(s[i]!=' ')
         {
             temp=temp+s[i];    
         }else{
             res.push_back(stoi(temp));
             temp.clear();
         }
     }
     res.push_back(stoi(temp));
     return res;
        
 }

牛客输入输出8:字符串排序(1)
题目:
在这里插入图片描述
代码:

#include<bits/stdc++.h>
using namespace std;
int main() {
    int n;
    cin >> n;
    vector<string> arr;
    for (int i = 0; i < n; i++) {
        string tmp;
        cin >> tmp;
        arr.push_back(tmp);
    }
    sort(arr.begin(), arr.end()); //字符串的排序是按照首字母来排序把反正就是
    for (string s: arr) {
        cout << s << " ";
    }
}

牛客输入输出9:字符串排序(2)
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int main() {
    string str;
    string temp;
    vector<string> ans;
    while(getline(cin,str)){
        ans.clear();
        stringstream ss(str);
        while(getline(ss,temp,' ')) //在这个geline的过程中,注意到getline重复一个元素会吞没他的值所以不用清空temp
            ans.push_back(temp);
        sort(ans.begin(),ans.end());
        for(int i=0;i<ans.size();i++)
            cout<<ans[i]<<' ';
        cout<<endl;  //注意 因为没有回车,报错了!因为我输入一行,回车就输出一行下次你怎么办!
        //提前回车给下一行输入啊要。。。
        //也就是说回车一般在输出这个地方留意啊
    }
   return 0;
}

牛客输入输出10:字符串排序(3)
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int main(){
    string str;
    string temp;
    vector<string> res;
    while(getline(cin,str)){
        stringstream ss(str);
        res.clear();
        while(getline(ss,temp,',')){
            res.push_back(temp);
        }
        sort(res.begin(),res.end());
        for(int i=0;i<res.size()-1;i++)
            cout<<res[i]<<',' ;
            cout<<res[res.size()-1]<<endl ;
    }
    return 0; 
}

牛客输入输出12:
在这里插入图片描述
备注: 这个题目不难但是一直不能通过第二个测试案例,发现是数字太大了,这个时候找了下,可以用stol 字符转换为long类型,而不是stoi,但是注意到accumulate也是int的累加,有点问题的。所以直接用sum来操作了。还有个就是 char-'0’变数字 包括 数字+'0’变成char只能针对1个字符或者数字的情况操作

#include<bits/stdc++.h>
using namespace std;
int main(){
    string s;
    while(getline(cin,s)){
        stringstream ss(s);
        string temp;
        vector<long> num;
        long sum=0;
        while(getline(ss,temp,' ')){
            num.push_back(stol(temp)); 
            sum+=stol(temp);
        }
        cout<<sum<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值