Create arithmetic_derivative.c

This commit is contained in:
Racoonicorn 2016-12-09 22:14:05 +01:00 committed by GitHub
parent 7b2558db70
commit 702dfc9cc3
1 changed files with 66 additions and 0 deletions

66
arithmetic_derivative.c Normal file
View File

@ -0,0 +1,66 @@
#define VER "0.3.1"
#define N 20
#include <stdio.h>
int derivata (int n);
void split (int value, int *a, int *b);
int main () {
int n, res;
int sgn;
char again;
do {
sgn = 1;
do {
printf ("Inserisci numero: ");
scanf ("%d", &n);
} while (0); // vanno messe condizioni
if (n < 0)
sgn = -1;
res = derivata (sgn * n);
res = sgn * res;
printf ("La derivata di %d è: %d", n, res);
getchar ();
printf ("\nAncora? [s/n] ");
scanf ("%c", &again);
} while (again == 's');
printf ("\n\n\nversion: %s", VER);
}
int derivata (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);
} else {
n = 1;
}
return n;
break;
}
}
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;
j++;
i = 1;
}
}
res[0] = --j;
for (i = 1; i < res[0]; i++) {
*a = *a * res[i];
}
*b = res[res[0]];
}