• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Duże liczby nie działają na moim programie

Object Storage Arubacloud
0 głosów
210 wizyt
pytanie zadane 10 stycznia 2018 w C i C++ przez Admin Cpp Początkujący (350 p.)
edycja 10 stycznia 2018 przez Eryk Andrzejewski

Witam
 

#include <iostream>
#include <cstdlib>
#include <string>
#include <sstream>
#include <windows.h>

using namespace std;

long double test,n;

long double silnia(long double n)
{
    if(n==1||n==0) return 1;
    else return n*silnia(n-1);
}
int main()
{
    cin>>test;
    system("cls");
    for(int i=1; i<=test; i++)
    {
        cin>>n;
        system("cls");
        stringstream ss;
        ss<< silnia(n) <<endl;
        string liczba= ss.str();
        long double a=liczba.length();
        if (a-3<0)
        cout<<"0"<<" "<<liczba[a-2]<<endl;
        else
        cout<<liczba[a-3]<<" "<<liczba[a-2]<<endl;

    }
    return 0;
}


Mój program oblicza silnię pokazuję jej cyfrę dzisiątek i jedności. Niestety nie działa on dla liczba powzyej 9999 ( wyłącza się ) lub pisze nieskończoność. Jak moge temu zaradzić? Czy jest jakiś sposób, żeby komputer to obliczył?

z góry dziękuję

komentarz 10 stycznia 2018 przez Eryk Andrzejewski Mędrzec (164,260 p.)
Kod źródłowy proszę umieszczać w bloczku code.

1 odpowiedź

+1 głos
odpowiedź 10 stycznia 2018 przez Eryk Andrzejewski Mędrzec (164,260 p.)
wybrane 10 stycznia 2018 przez Admin Cpp
 
Najlepsza

Nie możesz tak po prostu obliczyć wartości silni dla ogromnych argumentów - wartość będzie jeszcze bardziej ogromną liczbą, którą podstawowe typy (nawet taki long double) nie będą w stanie pomieścić.
Co mogę Ci zaproponować? Po każdym mnożeniu przez kolejną liczbę (bo np. 5! = 1 * 2 * 3 * 4 * 5), zachowuj tylko cyfry jedności i dziesiątek - pozostałe nie będą Ci potrzebne, jeśli chcesz obliczyć tylko cyfry jedności i dziesiątek silni. Przykład:

7! = 5040

Ale załóżmy, że owe 5040 to ogromna wartość, i chcemy policzyć to wspomnianym wcześniej algorytmem.

1 * 2 = 2
2 * 3 = 6
6 * 4 = 24
24 * 5 = 120 // Zachowujemy tylko 20
20 * 6 = 120 // Zachowujemy tylko 20
20 * 7 = 140 // Zachowujemy tylko 40

A więc dwie ostatnie cyfry naszej silni to 40. Możemy teraz łatwo odczytać ostatnią oraz przedostatnią cyfrę.

unsigned result = 40; //Oczywiście tutaj 40 należy zamienić wywołaniem funkcji
unsigned last = result % 10;
unsigned next_to_last = result / 10; // Wykorzystujemy fakt, że przy dzieleniu oba operandy są typu całkowitego - nie musimy rzutować tego "wprost"

Można to też oczywiście zrobić poprzez konwersję na typ std::string, przy pomocy funkcji std::to_string(), a następnie odczytać określone cyfry - jak to zrobić to chyba wiesz. wink

komentarz 10 stycznia 2018 przez Admin Cpp Początkujący (350 p.)
Bardzo dziękuje :)

Podobne pytania

0 głosów
1 odpowiedź 228 wizyt
pytanie zadane 13 stycznia 2018 w C i C++ przez Admin Cpp Początkujący (350 p.)
0 głosów
6 odpowiedzi 843 wizyt
pytanie zadane 14 maja 2016 w C i C++ przez DeBos123 Nałogowiec (44,950 p.)
+1 głos
1 odpowiedź 551 wizyt
pytanie zadane 23 października 2021 w PHP przez stanislawruszkowski Obywatel (1,310 p.)

92,565 zapytań

141,416 odpowiedzi

319,598 komentarzy

61,948 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...