Регистрация не е нужна, освен при създаване на тема в "Задача на седмицата".

Задача..

Задача..

Мнениеот Гост » 03 Ное 2016, 20:05

Дадено е 5-цифрово число да се изведе сумата от цифрите на това число на екрана със C++ !?
Гост
 

Re: Задача..

Мнениеот Davids » 03 Ное 2016, 20:55

Давам принципа, надявам се кодовата част да си способен да я сътвориш :D
Ако числото ти е [tex]a[/tex] от тип интиджър, то отделните му цифри можеш да вземеш по два начина, от които предпочитам първия:
- взимаш числото и го делиш в един while loop на [tex]10^n[/tex], докато числото ти е по-голямо от дадената степен на десятката (т.е., докато още има цифри след тази позиция). При всяко едно деление взимаш остатъка, начисляваш го към сумата и увеличаваш степента.

- другият вариант е да преобразуваш интиджъра в стринг, след което чисто и просто да го превърнеш в масив от символи (всеки от които ще е цифра) и да преобразуваш отново символите в интиджъри, след което ги събираш и сумата е готова.
*Нещо непосредствено и интересно, привличащо вниманието на читателя и оставящо го с приятна топла усмивка на лицето.*
----
Вече не го правя само за точката. :lol:
Davids
Математик
 
Мнения: 2394
Регистриран на: 16 Ное 2015, 11:47
Рейтинг: 2552

Re: Задача..

Мнениеот Davids » 09 Ное 2016, 12:29

Скалъпих едно кодче по математическия алгоритъм (все пак сме във форум за математика :lol:), но ограничението за големина на интиджър е [tex]32767 (2^{15}-1) = 1 073 676 289[/tex], така че по-големи цифри съм премахнал. Съответно по-удобен е вариантът по пътя на разграждане на стринга, ако ще работиш с по-големи числа. Оградил съм ти съществената алгоритмична част, другото е за потребителски комфорт :mrgreen:

Код: Избери целия код
#include <iostream>
#include <stdlib.h>
#include <string>
#include <sstream>

using namespace std;


bool is_number(const string& s);
int int_pow(int base, int exp);


int main()
{
    cout << "Vuvedete chislo: ";
    string szInput;
    int number;
    while(true)
    {
        getline(cin, szInput);

        if(!is_number(szInput))
        {
            cout << "Vuvedenoto ne beshe chislo!\nOpitaite pak: ";
            continue;
        }

        if(szInput.length() > 10)
        {
            cout << "Maximalnata stoinost za integer v programnata sreda e 1 073 676 289,\nzatova davai po-kratko, pod 10 cifri: ";
            continue;
        }

        istringstream(szInput) >> number;
        number = abs(number);

        //Sushtestvenata algoritmichna chast
        int power = 0;
        int single_digit = 0;
        int sum = 0;
        string delimiter;
        cout << "Sumata e ravna na:\nS = ";
        do{
            single_digit = (int)(number % int_pow(10, power+1))/(int_pow(10, power));
            sum += single_digit;
            delimiter = (number > int_pow(10, power+1)) ? " + " : " = ";    //opcionalno - za krasota :D
            cout << single_digit << delimiter;
            power++;
        }
        while(number > int_pow(10, power));
        cout << sum << endl;
        //Krai, drugoto e za priglednost :D
        break;
    }
    cout << endl << "Dovijdane! :D" << endl;
    return 0;
}

inline bool is_number(const std::string & s)
{
   if(s.empty() || ((!isdigit(s[0])) && (s[0] != '-') && (s[0] != '+'))) return false ;

   char * p;
   strtol(s.c_str(), &p, 10) ;

   return (*p == 0) ;
}

int int_pow(int base, int exp)
{
    int result = 1;
    while (exp)
    {
        if (exp & 1)
           result *= base;
        exp /= 2;
        base *= base;
    }
    return result;
}


--

Това съответно е вариантът с по-дългите стрингове по пътя на текстовия анализ. По-ефективен излиза, но пък другият е математически :D
Код: Избери целия код
#include <iostream>
#include <stdlib.h>

using namespace std;


bool is_number(const string& s);
int int_pow(int base, int exp);


int main()
{
    cout << "Vuvedete chislo: ";
    string szInput;
    while(true)
    {
        getline(cin, szInput);

        if(!is_number(szInput))
        {
            cout << "Vuvedenoto ne beshe chislo!\nOpitaite pak: ";
            continue;
        }

        cout << "Sumata e ravna na:\nS = ";
        int single_digit, sum = 0;
        string delimiter;
        char c;
        //for(char& c : szInput)
        for(string::size_type i = 0; i < szInput.size(); ++i)
        {
            c = szInput[i];
            single_digit = c - '0';
            sum += single_digit;
            delimiter = (i != szInput.size() - 1) ? " + " : " = ";    //opcionalno - za krasota :D
            cout << single_digit << delimiter;
        }
        cout << sum << endl;
        break;
    }
    cout << endl << "Dovijdane! :D" << endl;
    return 0;
}

inline bool is_number(const std::string & s)
{
   if(s.empty() || ((!isdigit(s[0])) && (s[0] != '-') && (s[0] != '+'))) return false ;

   char * p;
   strtol(s.c_str(), &p, 10) ;

   return (*p == 0) ;
}

int int_pow(int base, int exp)
{
    int result = 1;
    while (exp)
    {
        if (exp & 1)
           result *= base;
        exp /= 2;
        base *= base;
    }
    return result;
}
*Нещо непосредствено и интересно, привличащо вниманието на читателя и оставящо го с приятна топла усмивка на лицето.*
----
Вече не го правя само за точката. :lol:
Davids
Математик
 
Мнения: 2394
Регистриран на: 16 Ное 2015, 11:47
Рейтинг: 2552


Назад към Друго



Кой е на линия

Регистрирани потребители: Google [Bot]

Форум за математика(архив)