輸入一行數字,數字用逗號隔開,輸出這串數字中奇數和偶數的和,假設數字不超過某個數(自定義)
例如: 輸入 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,第一個逗號是第一個數的結尾,第二個數字起點是上一個逗號(第一個數字的結尾),末尾是第二個逗號……如此迭代,所以要在最後數字結尾加“,”才能找到最後數字串的長度以便於將數字串拷貝出來轉換成數字。