Nukascia

PrasauPagalboss C++

Recommended Posts

Sąlyga: Loterijoje laimingi laikomi tie skaičiai, kurie dalinasi be liekanos iš savo skaitmenų sumos. 

Parašykite programą, kuri intervale [n;m] rastų visus laimingus skaičius ir atspausdintų juos ekrane po vieną eilutėje. Pasitikrinkite, kai n=10, m=20.

 

Neįsivaizduoju, kaip užrašyt, jog dalinasi iš savo skaitmenų sumos.

tam, kas atras laiko pagelbėt secsas telefonu

// laimingi sk
#include <iostream>
using namespace std;
int main()
{
int n, m, skaic=0;
cout << "iveskite sk intervala" << endl;
cin >> n >> m;
for (int i=n; i<=10; i++){
?????????????????
cout << i << endl;
skaic++;
}  
return 0;
}

 

 

Redaguota , nario Nukascia
Nuoroda iki šio pranešimo
Dalintis per kitą puslapį
#include <iostream>

using namespace std;

int main()
{
    int n, m, sk1, sk2;

    cout << "Iveskite intervala: " << endl;
    cin >> n >> m;

    for(int i = n; i <= m; i++)
    {
        sk1 = i / 10;
        sk2 = i % 10;

        if(i % (sk1 + sk2) == 0)	cout << i << endl;
    }
    return 0;
}

Nebandžiau, bet pagal mane turėtų veikti.

Redaguota , nario Lixi9
Nuoroda iki šio pranešimo
Dalintis per kitą puslapį
1 minute prieš, Lixi9 parašė:
#include <iostream>

using namespace std;

int main()
{
    int n, m, sk1, sk2;

    cout << "Iveskite intervala: " << endl;
    cin >> n >> m;

    for(int i = n; i <= m; i++)
    {
        sk1 = i / 10;
        sk2 = i % 10;

        if(i % (sk1 + sk2) == 0)	cout << i << endl;
    }
    return 0;
}

Nebandžiau, bet pagal mane turėtų veikti.

aciu labai

Nuoroda iki šio pranešimo
Dalintis per kitą puslapį
prieš 2 valandas(-ų), Kadolis parašė:
#include <iostream>

using namespace std;

int main()
{
    int n, m, sk1, sk2;

    cout << "Iveskite intervala: " << endl;
    cin >> n >> m;

    for(int i = n; i <= m; i++)
    {
        sk1 = i / 10;
        sk2 = i % 10;

        if(i % (sk1 + sk2) == 0)	cout << i << endl;
    }
    return 0;
}

Nebandžiau, bet pagal mane turėtų veikti.

o jei skaicius trizenklis?

Nuoroda iki šio pranešimo
Dalintis per kitą puslapį
30 minutes prieš, marcus parašė:

o kur praso patikrint, kad skaicius trizenklis? :D

 

prieš 14 valandas(-ų), Nukascia parašė:

Sąlyga: Loterijoje laimingi laikomi tie skaičiai, kurie dalinasi be liekanos iš savo skaitmenų sumos.

Prašyt gal ir neprašo, bet iš esmės teisingas sprendimas būtų jei veiktu ir su triženkliais ir keturženkliais ir t.t. Jei kam įdomu: http://algirdas.jggimnazija.lt/?page_id=2027

Redaguota , nario Amxxl
Nuoroda iki šio pranešimo
Dalintis per kitą puslapį
prieš 5 valandas(-ų), marcus parašė:

o kur praso patikrint, kad skaicius trizenklis? :D

salygoje

prieš 18 valandas(-ų), Nukascia parašė:

Sąlyga: Loterijoje laimingi laikomi tie skaičiai, kurie dalinasi be liekanos iš savo skaitmenų sumos. 

Parašykite programą, kuri intervale [n;m] rastų visus laimingus skaičius ir atspausdintų juos ekrane po vieną eilutėje.

 

Nuoroda iki šio pranešimo
Dalintis per kitą puslapį
#include <iostream>
#include <bitset>
#include <cmath>

int getBinaryPlaces(int number);
int getDecimals(int number, int decimals[]);
int getLuckyNumbers(int start, int end, int lNumbers[], int arrSize);

int main()
{
    int start, end;
    std::cout << "[INFO]: Iveskite intervalo pradzia (imtinai): ";
    std::cin >> start;
    std::cout << "[INFO]: Iveskite intervalo pabaiga (imtinai): ";
    std::cin >> end;
    if (start > end) {
        int temp = start;
        start = end;
        end = temp;
    }
    
    std::cout << "[INFO]: Laimingieji skaiciai yra: ";
    int lNumbers[10];
    int size = getLuckyNumbers(start, end, lNumbers, (sizeof(lNumbers) / 4));
    for (int i = 0; i < size; i++) {
        std::cout << lNumbers[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

int getBinaryPlaces(int number) {
    int count = 0;
    int size = sizeof(number)*8; // int = 4 byte = 4*8 bits 
    for (int i = 0; i < size; i++) {
        if ((number >> i) & 0x1) { // if bit with offset i is 1, increment the count
            count = i+1;
        }
    }
    return count;
    
}

int getDecimalPlaces(int number) {
    return !number ? 1 : ceil(static_cast<float>(getBinaryPlaces(number)) / 3); // if number == 0 return 1 else return decimal places from function
}

int getDecimals(int number, int decimals[]) {
    int places = getDecimalPlaces(number);
    int base = pow(10, places-1);
    decimals[0] = number / base;
    for (int i = 1; i < places; i++) {
        number -= decimals[i-1] * base;
        base /= 10;
        decimals[i] = number / base;
    }
    return places;

}

int getLuckyNumbers(int start, int end, int lNumbers[], int arrSize) {
    int size = 0;
    while (start <= end && size < arrSize) {
        int decimals[11];
        int arrLength = getDecimals(start, decimals); 
        int value = 0;
        for (int i = 0; i < arrLength; i++) {
            value += decimals[i];
        }
        if (value != 0 && start % value == 0) {
            lNumbers[size] = start;
            size++;
        }
        start++;
    }
    return size;
}

@Nukascia @Zero Two
Mano universalus sprendimas, kuris apskaiciuoja bet kokio dydžio skaičius. Gal kažkiek atrodo baisokai, bet galiu tuojau pat viską paaiškint:
 

  1. Išgavau skaičiaus ilgį. Ilgai galvojau, kol suradau vieną sprendimą.
    • Panaudojau bitų maskuotes (angl. bit mask) bei bitų manipuliaciją (bit shifting), pagal tai aÅ¡ galėjau iÅ¡gauti ar bitas yra tiesa (1/true) arba netiesa (0/false), jeigu bitas yra tiesa, aÅ¡ iÅ¡gaudavau paskutinę bito reikÅ¡mę iki tol kol baigiasi ciklas (angl. loop), paskutinis bito indeksas nurodo skaičiaus bitų sekos ilgį.
    • Gavęs bitų sekos ilgį, aÅ¡ galėjau iÅ¡gauti skaičiaus skaitmenų kiekį? Kaip? Kadangi dviejuose bituose gali tilpti tik iki 3 skaičių (neskaitant nulinės reikÅ¡mės): 01 = 1, 10 = 2, 11 = 3, aÅ¡ padalinau visą seką iÅ¡ 3, bei suapvalinau į didžiają pusę, bei taip gavau deÅ¡imtainės sistemos skaičiaus skaitmenų kiekį iÅ¡ dvejatainės (angl. base 2) binary sistemos.
  2. Pagal skaičiaus skaitmenų ilgį aš radau visus skaičiaus skaitmenis. Naudojau tapatį principą, kokį @Kadolis nurodė, tik šiek tik optimalesnį variantą, kadangi kompiuteris tada negalvoja reikšmės iš naujo, nes naudoja tapatį kintamąjį, kurį naudojo praeitas ciklas (angl. loop). kintamasis1 % kintamasis2 taspats yra kaip ((static_cast<float>(kintamasis1) / kintamasis2) - (kintamasis1 / kintamasis2)) * kintamasis2. Tas ženklas/operatorius tiesiog nurodo po dalybos, liekaną.
  3. Na ir tada savaime aišku, pagal tai radau laimingus skaičius, kadangi skaičius negali dalintis iš 0, jeigu reikšmė 0 tai jis ir nebus laimingas, viska įkėliau į masyvą ir grąžinau į main funkciją.
  4. Iš main funkcijos padariau klausimus su cin funkcija bei parodžiau laimingus skaičius.

Tikiuosi aiškiai viskas atrodo, bei čia jau toks perfect labai gaunasi sprendimas, toks egzamine VBE nereikalingas, ten duoda limitus lape, kuriais turi remtis, ir šitas sprendimas, daug ėda resursų palyginus su kitais sprendimais, nes reikia kompiuteriui rasti skaičiaus ilgį papildomai bei rasti jo skaičius pačiam. Sėkmės!

Redaguota , nario Dovias
Įdėjau funkcijų prototipus, panaikinau nereikalingą kintamąjį.
Nuoroda iki šio pranešimo
Dalintis per kitą puslapį
prieš 13 valandas(-ų), Dovias parašė:
#include <iostream>
#include <bitset>
#include <cmath>

int getBinaryPlaces(int number);
int getDecimals(int number, int decimals[]);
int getLuckyNumbers(int start, int end, int lNumbers[], int arrSize);

int main()
{
    int start, end;
    std::cout << "[INFO]: Iveskite intervalo pradzia (imtinai): ";
    std::cin >> start;
    std::cout << "[INFO]: Iveskite intervalo pabaiga (imtinai): ";
    std::cin >> end;
    if (start > end) {
        int temp = start;
        start = end;
        end = temp;
    }
    
    std::cout << "[INFO]: Laimingieji skaiciai yra: ";
    int lNumbers[10];
    int size = getLuckyNumbers(start, end, lNumbers, (sizeof(lNumbers) / 4));
    for (int i = 0; i < size; i++) {
        std::cout << lNumbers[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

int getBinaryPlaces(int number) {
    int count = 0;
    int size = sizeof(number)*8; // int = 4 byte = 4*8 bits 
    for (int i = 0; i < size; i++) {
        if ((number >> i) & 0x1) { // if bit with offset i is 1, increment the count
            count = i+1;
        }
    }
    return count;
    
}

int getDecimalPlaces(int number) {
    return !number ? 1 : ceil(static_cast<float>(getBinaryPlaces(number)) / 3); // if number == 0 return 1 else return decimal places from function
}

int getDecimals(int number, int decimals[]) {
    int places = getDecimalPlaces(number);
    int base = pow(10, places-1);
    decimals[0] = number / base;
    for (int i = 1; i < places; i++) {
        number -= decimals[i-1] * base;
        base /= 10;
        decimals[i] = number / base;
    }
    return places;

}

int getLuckyNumbers(int start, int end, int lNumbers[], int arrSize) {
    int size = 0;
    while (start <= end && size < arrSize) {
        int decimals[11];
        int arrLength = getDecimals(start, decimals); 
        int value = 0;
        for (int i = 0; i < arrLength; i++) {
            value += decimals[i];
        }
        if (value != 0 && start % value == 0) {
            lNumbers[size] = start;
            size++;
        }
        start++;
    }
    return size;
}

@Nukascia @Zero Two
Mano universalus sprendimas, kuris apskaiciuoja bet kokio dydžio skaičius. Gal kažkiek atrodo baisokai, bet galiu tuojau pat viską paaiškint:
 

  1. Išgavau skaičiaus ilgį. Ilgai galvojau, kol suradau vieną sprendimą.
    • Panaudojau bitų maskuotes (angl. bit mask) bei bitų manipuliaciją (bit shifting), pagal tai aÅ¡ galėjau iÅ¡gauti ar bitas yra tiesa (1/true) arba netiesa (0/false), jeigu bitas yra tiesa, aÅ¡ iÅ¡gaudavau paskutinę bito reikÅ¡mę iki tol kol baigiasi ciklas (angl. loop), paskutinis bito indeksas nurodo skaičiaus bitų sekos ilgį.
    • Gavęs bitų sekos ilgį, aÅ¡ galėjau iÅ¡gauti skaičiaus skaitmenų kiekį? Kaip? Kadangi dviejuose bituose gali tilpti tik iki 3 skaičių (neskaitant nulinės reikÅ¡mės): 01 = 1, 10 = 2, 11 = 3, aÅ¡ padalinau visą seką iÅ¡ 3, bei suapvalinau į didžiają pusę, bei taip gavau deÅ¡imtainės sistemos skaičiaus skaitmenų kiekį iÅ¡ dvejatainės (angl. base 2) binary sistemos.
  2. Pagal skaičiaus skaitmenų ilgį aš radau visus skaičiaus skaitmenis. Naudojau tapatį principą, kokį @Kadolis nurodė, tik šiek tik optimalesnį variantą, kadangi kompiuteris tada negalvoja reikšmės iš naujo, nes naudoja tapatį kintamąjį, kurį naudojo praeitas ciklas (angl. loop). kintamasis1 % kintamasis2 taspats yra kaip ((static_cast<float>(kintamasis1) / kintamasis2) - (kintamasis1 / kintamasis2)) * kintamasis2. Tas ženklas/operatorius tiesiog nurodo po dalybos, liekaną.
  3. Na ir tada savaime aišku, pagal tai radau laimingus skaičius, kadangi skaičius negali dalintis iš 0, jeigu reikšmė 0 tai jis ir nebus laimingas, viska įkėliau į masyvą ir grąžinau į main funkciją.
  4. Iš main funkcijos padariau klausimus su cin funkcija bei parodžiau laimingus skaičius.

Tikiuosi aiškiai viskas atrodo, bei čia jau toks perfect labai gaunasi sprendimas, toks egzamine VBE nereikalingas, ten duoda limitus lape, kuriais turi remtis, ir šitas sprendimas, daug ėda resursų palyginus su kitais sprendimais, nes reikia kompiuteriui rasti skaičiaus ilgį papildomai bei rasti jo skaičius pačiam. Sėkmės!

Jei noretum padaryti dar tobulesni, galetum padaryti su skaiciais didesniais uz int limita :D

As asmeniskai nesu megejas skaiciu dalybos ir mod naudojimo, tai tikriausiai all-round sprendimas galetu buti panaudojant string'us, tada galetum betkokio dydzio skaicius irasyti, nes dabar capped butu ant 2^32

Nuoroda iki šio pranešimo
Dalintis per kitą puslapį

Prisijungti prie diskusijos

Palikti atsakymą galite iš karto, o užsiregistruoti vėliau. Jeigu jau turite paskyrą mūsų forume, Prisijunkite.

Svečias
Atsakyti Å¡ioje temoje...

×   Ä®klijuotas tekstas turi teksto formatavimą.   PaÅ¡alinti teksto formatavimą

  Galimi tik 75 veidukai.

×   Nuoroda buvo automatiÅ¡kai įterpta.   Ä®terpti nuorodą paprastai

×   JÅ«sų ankstesnis praneÅ¡imas buvo atkurtas.   IÅ¡valyti redaktorių

×   JÅ«s negalite įkelti nuotraukas tiesiogiai.Ä®kelkite arba įdėkite nuotraukas iÅ¡ URL.


  • Å iame puslapyje narÅ¡o:   0 nariai

    Nėra registruotų narių peržiūrinčių šį forumą.