華爲機試【按要求輸出偶數,奇數之和】

輸入一行數字,數字用逗號隔開,輸出這串數字中奇數和偶數的和,假設數字不超過某個數(自定義)

例如: 輸入 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,第一個逗號是第一個數的結尾,第二個數字起點是上一個逗號(第一個數字的結尾),末尾是第二個逗號……如此迭代,所以要在最後數字結尾加“,”才能找到最後數字串的長度以便於將數字串拷貝出來轉換成數字。


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