[C++/Problem] Podział stringa przy operacjach na dużych liczbach.
Ostatnio zmodyfikowano 2016-05-29 16:32
carlosmay |
» 2016-05-29 14:25:04 #include <iostream> #include <vector> #include <string> #include <cstdlib>
auto main()->int { std::string str { "8000000000+888888888" }; std::string firstNumber, secondNumber; char mathMark; int i = 0; while( str[ i ] != '+' ) { firstNumber.push_back( str[ i++ ] ); } mathMark = str[ i++ ]; while( str[ i ] != '\0' ) { secondNumber.push_back( str[ i++ ] ); } std::cout << firstNumber << ' ' << mathMark << ' ' << secondNumber << '\n'; switch( mathMark ) { case '+': std::cout << std::stoll( firstNumber ) + std::stoll( secondNumber ) << '\n'; break; case '-': break; } } |
|
hit |
» 2016-05-29 14:25:09 Niekoniecznie : ) za każdym razem wartość będzie w 's'. Musisz zatem rozpoznawać, który to obrót pętli. Najszybciej coś takiego: int i = 0; string l1, z, l2; string s = "123 + 456"; while( getline( cin, s, ' ' ) ) { if( i == 0 ) l1 = s; if( i == 1 ) z = s; if( i == 2 ) l2 = s; i++; } Choć pewnie da się to ładniej zrobić. |
|
carlosmay |
» 2016-05-29 14:33:59 Nieprzemyślane to było: int i = 0; while( isdigit( str[ i ] ) && str[ i ] != '\0' ) { firstNumber.push_back( str[ i++ ] ); }
mathMark = str[ i++ ];
while( isdigit( str[ i ] ) && str[ i ] != '\0' ) { secondNumber.push_back( str[ i++ ] ); }
... teraz jest lepiej. Będzie wykrywać różne znaki. |
|
anna61 Temat założony przez niniejszego użytkownika |
» 2016-05-29 14:39:37 Dziękuję Wam bardzo za pomoc, teraz już zaczynam coraz bardziej to rozumieć. @carlosmay Możesz mi wytłumaczyć dlaczego w pętli while jest znak różności, a dlaczego nie może być równość? I jaka jest zasada działania "stoll"? |
|
carlosmay |
» 2016-05-29 14:49:46 I jaka jest zasada działania "stoll"? | stoll() - konversja string do long longMożesz mi wytłumaczyć dlaczego w pętli while jest znak różności |
Może być znak równości, ale wtedy całe porównanie do znaku musi być zanegowane. while( isdigit( str[ i ] ) && !( str[ i ] == '\0' ) )
Zasada działania jest taka: |
|
anna61 Temat założony przez niniejszego użytkownika |
» 2016-05-29 14:56:31 Teraz już w pełni rozumiem. A jest jakaś różnica pomiędzy cout/cin a printf/scanf? Czy jest tak, że przy użyciu tego drugiego program działa szybciej i bardziej optymalnie czy raczej nie ma żadnych poważnych różnic? |
|
hit |
» 2016-05-29 15:04:26 Generalnie printf/scanf pochodzą z C, a cout/cin z C++ i są chyba prostsze do zrozumienia na samym początku. Jeśli chodzi o szybkość to przy takich konsolowych programach jak Twój różnice są niezauważalne. |
|
mateczek |
» 2016-05-29 15:29:52 a cojest złego w takim kodzie ?? #include <iostream> using namespace std; int main() { long long a, b; char znak; cin >> a >> znak >> b; if( znak == '+' ) cout << a + b << endl; }
|
|
1 « 2 » 3 |