diff --git a/arithmetic_derivative.c b/arithmetic_derivative.c index ce8fd11..a8e5f8a 100644 --- a/arithmetic_derivative.c +++ b/arithmetic_derivative.c @@ -1,9 +1,9 @@ -#define VER "0.3.1" -#define N 20 +#define VERSION "0.10" +#define N 100 #include -int derivata (int n); +int derive (int n); void split (int value, int *a, int *b); int main () { @@ -12,31 +12,29 @@ int main () { char again; do { sgn = 1; - do { - printf ("Inserisci numero: "); - scanf ("%d", &n); - } while (0); // vanno messe condizioni + printf ("Enter an integer: "); + scanf ("%d", &n); if (n < 0) sgn = -1; - res = derivata (sgn * n); + res = derive (sgn * n); res = sgn * res; - printf ("La derivata di %d è: %d", n, res); + printf ("The arithmetic derivative of %d is: %d", n, res); getchar (); - printf ("\nAncora? [s/n] "); + printf ("\nAgain? [y/n] "); scanf ("%c", &again); - } while (again == 's'); - printf ("\n\n\nversion: %s", VER); + } while (again != 'n'); + printf ("\n\n\nversion: %s", VERSION); } -int derivata (int n){ +int derive (int n){ int a = 1, b = 1; switch (n) { case 0: return 1; break; case 1: return 0; break; default: split (n, &a, &b); - if (a > 1 && b > 1){ // cioè non è primo - n = derivata(a) * b + a * derivata(b); + if (b > 1){ // not a prime + n = derive (a) * b + a * derive (b); } else { n = 1; } @@ -46,21 +44,14 @@ int derivata (int n){ } void split (int value, int *a, int *b) { - int i; - int j = 1; // res[0] è il numero di fattori di value - int res[N]; - - for (i = 2; i <= value; i++) { //andrebbe ottimizzato - if (value % i == 0){ - value = value / i; - res[j] = i; + int i = 2; + int j = 0; + do { + if (value % i == 0) { + *a = i; + *b = value / *a; j++; - i = 1; } - } - res[0] = --j; - for (i = 1; i < res[0]; i++) { - *a = *a * res[i]; - } - *b = res[res[0]]; + i++; + } while (j == 0); }