Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++/Problem] Podział stringa przy operacjach na dużych liczbach.

Ostatnio zmodyfikowano 2016-05-29 16:32
Autor Wiadomość
carlosmay
» 2016-05-29 14:25:04
C/C++
#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 '-':
        // zrób coś
        break;
    }
}
P-148684
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:

C/C++
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ć.
P-148685
carlosmay
» 2016-05-29 14:33:59
Nieprzemyślane to było:
C/C++
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.
P-148686
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"?
P-148687
carlosmay
» 2016-05-29 14:49:46
I jaka jest zasada działania "stoll"?
stoll() - konversja string do long long

Moż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.
C/C++
while( isdigit( str[ i ] ) && !( str[ i ] == '\0' ) )
Zasada działania jest taka:
  • sprawdź czy znak na pozycji "i" jest liczbą
  • sprawdż czy nie osiągnięto końca stringa
  • wykonuj pętlę póki oba warunki są prawdziwe
P-148688
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?
P-148690
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.
P-148691
mateczek
» 2016-05-29 15:29:52
a cojest złego w takim kodzie ??
C/C++
#include <iostream>
using namespace std;
int main()
{
    long long a, b;
    char znak;
    cin >> a >> znak >> b;
    if( znak == '+' ) cout << a + b << endl;
   
}
P-148692
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona