输入一行数字,数字用逗号隔开,输出这串数字中奇数和偶数的和,假设数字不超过某个数(自定义)
例如: 输入 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,第一个逗号是第一个数的结尾,第二个数字起点是上一个逗号(第一个数字的结尾),末尾是第二个逗号……如此迭代,所以要在最后数字结尾加“,”才能找到最后数字串的长度以便于将数字串拷贝出来转换成数字。