Cyfry dziesiątek i jedności w silni liczby

0

Napisalem program ktory liczy silnie a nastepnie wypisuje jej cyfre dziesiatek i jednosci ale program dziala dobrze tylko dla silni liczb 1-19, od 20 juz wyniki sa nie ok, a chce zeby dzialalo to w zakresie 1-30.

#include <stdio.h>
#include <stdlib.h>

int main(void){
  int n=0;
  int t=1;
  int d=0;
  int j=0;
  int r=0;
  int l=0;
  printf("; ");
  scanf("%i", &n);

  for(int i=1;i<=n;++i)
    t*=i;

  printf("%i\n\n", t);

  d=t/10;
  if(d>9){
    r=d%10;
    printf("%i ", r);
  }
  if(d<10)
  printf("%i ", d);

  l=d*10;
  j=t-l;
  printf("%i\n", j);

  return 0;
}
1

Do tego zadania nie masz liczyć silni.
Musisz tutaj użyć głowy, nie siły.

0

co do silni to się nie znam a reszta to tak:

int jedności=liczba%10;//liczba jedności
int dziesiątki=(liczba%100)/10;//dziesiątki i tak dalej ale nie jestem pewien % bo używam c++ 
0

Jak do tego zadania nie mam liczyc silni.... Mam obliczyc silnie a potem wypisac oddzielnie liczby dziesiatek i jednosci, i to wszystko ladnie dziala ale dopuki wypisuje dziesiatki i jednosci silni do 19, od 20 crash, a chce zeby dzialalo do 30, ma ktos jakies pomysly ?

1

Powodem wysypania się programu jest to, że liczysz silnie (tylko po co ?) i szybko przekraczasz zakres dla Twojej zmiennej.
Popatrz sobie np tu http://pl.wikipedia.org/wiki/Silnia cyfrę dziesiątek i jedności w silni dla np 10!. Potem popatrz dalej dla np 15! i popatrz bliżej dla np 4!

0

20! to 2.432902e+18, jestes pewiem, ze masz gdzie zmiescic taka liczbe? ;)

0

Oh przepraszam wczesniej cos zle robilem, okej dalem unsigned zmiennej t i liczy ladnie do 30.Mysle ze dobrze wykonalem tresc zadania:

Wejście napisał(a)

W pierwszej linii wejścia znajduje się jedna liczba całkowia D (1≤D≤30), oznaczjąca liczbę przypadków do rozważenia. Opis każdego przypadku składa się z jednej linii, w której znajduje się jedna nieujemna liczba całkowita n (0 ≤ n ≤ 1 000 000 000).

Wyjście napisał(a)

Dla każdego przypadku z wejścia. Twój program powinien wypisać w osobnej linii dokładnie dwie cyfry (oddzielone pojedynczą spacją): cyfrę dziesiątek i cyfrę jedności liczby n! zapisanej w systemie dziesiętnym.

zamiana znaczników <code> na <quote> - @furious programming

0
_user napisał(a):

Mysle ze dobrze wykonalem tresc zadania:

Tu nie chodzi o to żeby liczyć silnię, tylko o to żeby zrozumieć zadanie. wyżej masz wszystko co potrzebne żeby zrobić je w zasadzie bez liczenia silni.

0

Tak widzialem odpowiedzi, spojrzalem na ten link, ale nic mi nie przychodzi do glowy.
Z tego co mysle to na wejscie podaje:

2 - tutaj liczba tego ilu liczb bedziemy liczyc silnie np
4 - 1 liczba
8 - druga

I z tym zrobilem juz blad ale dobra widze ze na spoju wiele zadan tego wymaga to z tym zaczne od nastepnego, ale co do reszty bledow w tym zadaniu to nie wiem co poradzic.

0

To może pytania pomocnicze:
Musisz obliczyć n! czy tylko wyświetlić 2 ostatnie cyfry?
Co charakteryzuje liczby n! dla n>9?

0

maja tylko 00 na koncu ?

0

ja tez kiedys się z tym borykałem i uważam że hardcoding jest dla debili, ale spoj jest od tego, aby jak najszybciej wykonać zadanie a nie napisać funkcję licząca silnię

2

@_user - dokładnie, dlatego możesz liczyć silnie dla n<10, a dla większych zwyczajnie wyświetlać dwa zera.

Jeden ze sposobów na rozwiązanie tego zadania:

int i,j,D,n,s;
scanf("%i", &D);
for (i=0;i<D;i++) {
	scanf("%i", &n);
	if(n >= 10)
		printf("0 0");
	else {
		s=1;
		for (j=2;j<=n;j++)
			s*=j;
		printf("%i %i", (s%100)/10, s%10);
	}
}

Można również zhardkodować wszystkie odpowiedzi (parz wyżej), ale wtedy trzeba by było to i tak policzyć ręcznie (chociaż nie zaprzeczę, jest to najszybciej działające rozwiązanie).

0

okej dziekuje : )

2

Dla 5<=n<=9 cyfrę jedności masz równą 0, a cyfrę dziesiątek możesz policzyć np. tak (aby uniknąć pętli):

2<<(((~(n-5))&1)*(n-5)>>1)

:-D

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