Algorytm na silnie po swojemu :)

0

Witam, chciałbym zapytać czy algorytm który zrobiłem (na silnie) jest poprawny? Pytam dlatego ze zrobiłem go trochę po swojemu i na skróty ;)

#include <iostream>
using namespace std;

int main()
{

	int a=0,s=1;
	cin>>a;
	for(int i=0;i>=0;i++)
	{

		s=s*(a-i);
		if((a-i)==1) break;
			
	}
	cout<<s;




	char c;
	cin>>c;

	return 0;
} 

Wyniki niby się zgadzają a czy reszta jest poprawna?

1

Moim zdaniem przekombinowałeś.

0

Coś ostatnio ciśnienie na te silnie...

1

Człowieku, jakie skróty?
Czy może teraz nadmiarowy kod nazywa się skrótami?

#include <iostream>
using namespace std;
 
int main()
  { 
   unsigned a,s=1;
   cin>>a;
   while(a>1) s*=a--;
   cout<<s;
   return 0;
  }
0

hmm jeszcze jedno, powiedzmy ze obliczyłem silnie, to teraz w jaki sposób z tego wyniku mogę wyciągnąć cyfrę dziesiątek ?

0

Z tym, że jeżeli od samego początku potrzebowałeś jedynie cyfry dziesiątek (a nie wyniku całej silni), wtedy do problemu należy podejść zupełnie inaczej.

0

Mianowicie?

2

Zauważ, ze w rozkładzie liczby n!, gdzie n>=5 występuje 25, co daje nam ostatnią cyfre rowną 0.
Dla n>=10 mamy 2
5*10 - dwie ostatnie cyfry rowne 0.

1

0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800

Późniejsze silnie kończą się zawsze na 00. Tak więc wystarczy stablicować 10 liczb (tzn silnie od 0! do 9!) i mamy algo działające w czasie stałym.

edit:
Za późno

0
pingwindyktator napisał(a):

Zauważ, ze w rozkładzie liczby n!, gdzie n>=5 występuje 25, co daje nam ostatnią cyfre rowną 0.
Dla n>=10 mamy 2
5*10 - dwie ostatnie cyfry rowne 0.

możesz wytłumaczyć skąd wzięło się 25 i 25*10 ? dzięki

0

n! = 123..n,
np. 5!=1
2345=(25)34,
10!=12345678910=(2510)34678*9

1 użytkowników online, w tym zalogowanych: 0, gości: 1