华为机试【按要求输出偶数,奇数之和】

输入一行数字,数字用逗号隔开,输出这串数字中奇数和偶数的和,假设数字不超过某个数(自定义)

例如: 输入 3,5,7,2,8

             输出应为15 10

#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main()
{	
 //奇数和为sumo,偶数和为sume
        int sume=0,sumo=0;
 //从标准输入读取一行,保存到字符串s,再把s转化为字符串流,逐个输出到字符ch中,<span style="font-family: Arial, Helvetica, sans-serif;">若ch为逗号,把逗号转换成空格‘ ’并保存到字符数组str中,若是字符数字就直接保存</span>
	for(string s;getline(cin,s);)
	{
		char ch;char str[20]={0};int i=0;
		for(istringstream strin(s);strin>>ch;)
		{
		
			if(ch==',')
			    str[i++]=' ';
			if(ch!=',')
				str[i++]=ch;
		}
 //逗号转化成空格的字符串位置不变地保存到str中,对字符数组str流化并逐个输出到整形a中,如果a是奇数就累加sumo,否则累加sume
		int a;
		for(istringstream sin(str);sin>>a;)
		{
			if(a%2==0)
				sume+=a;
			if(a%2!=0)
				sumo+=a;
		}
		cout<<sumo<<" "<<sume<<endl;
		break;
	}
	system("pause");
	return 0;
}

注意事项:

局部变量的初始化(整形数,字符数组,字符串等);

因为最外层的循环getline()函数的特性,要在该循环末加入break退出(否则无限读输入,哪怕是回车);

逗号转为空格,利用流对象输入的特性(如sin>>a,碰到空格就读下个数)


补充第2种方法:

#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;


int main(){
	cout << "please enter the set of number which separated by common:" << endl;
	string s1;
	cin >> s1;


	string s;
	s = s1 + ",";
	int b = 0;
	int odd = 0;
	int even = 0;
	for (int i = 0; i < sizeof(s); i++){
		if (s[i] == ','){
			string subs = s.substr(b,i-b);
			int num = atoi(subs.c_str());
			if(num%2){
				odd = odd + num;
			}else{
				even = even + num;
			}
			b = i + 1;
		}
	}
	cout << odd << " " << even << endl;
	return 0;
}

注意事项:

1.关键是在字符串末尾加逗号,否则无法找到最后一个数字,因为程序的原理是碰到逗号就返回其位置i,然后计算i-0(起始点到逗号前的距离),通过substr拷贝出来的那段就是数字串,再用atoi转换为数字(因为atoi的参数是char*所以要用c_str()转换),最后的判断逻辑是一样的

2.迭代过程是:默认字符串起点是0,第一个逗号是第一个数的结尾,第二个数字起点是上一个逗号(第一个数字的结尾),末尾是第二个逗号……如此迭代,所以要在最后数字结尾加“,”才能找到最后数字串的长度以便于将数字串拷贝出来转换成数字。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章