192 lines
4.7 KiB
C
192 lines
4.7 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
// Renvoie la racine carrée d'un nombre entier positif, sinon -1
|
|
int racineCarre(int nb) {
|
|
if (nb == 0 || nb == 1) return nb;
|
|
|
|
int prob = nb / 2;
|
|
int nextProb;
|
|
|
|
while (1) {
|
|
nextProb = (prob + nb / prob) / 2;
|
|
|
|
if (nextProb >= prob) {
|
|
break;
|
|
};
|
|
|
|
prob = nextProb;
|
|
}
|
|
|
|
if ((prob * prob) == nb) {
|
|
return prob;
|
|
} else {
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
// Renvoie un tableau de racine carré de tab
|
|
int* racineCarreTab(int tab[], int taille) {
|
|
int* result = (int*)malloc(taille * sizeof(int));
|
|
for (int i = 0; i < taille; i++) {
|
|
result[i] = racineCarre(tab[i]);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
// Renvoie un tableau tirer
|
|
int* TriSpecial(int tab[], int taille) {
|
|
int nonEntier = 0;
|
|
for (int i = 0; i < taille; i++) {
|
|
if (racineCarre(tab[i]) == -1) {
|
|
nonEntier++;
|
|
}
|
|
}
|
|
|
|
int* result = (int*)malloc(taille * sizeof(int));
|
|
|
|
if (nonEntier % 2 == 0) {
|
|
int somme = 0;
|
|
for (int i = 0; i < taille; i++) {
|
|
somme += tab[i]; // Calcul somme
|
|
}
|
|
|
|
for (int i = 0; i < taille; i++) {
|
|
if (i % 2 == 0) { // Pair
|
|
result[i] = tab[i];
|
|
} else { // Impair
|
|
result[i] = somme * tab[i];
|
|
}
|
|
}
|
|
} else {
|
|
int* racines = (int*)malloc(taille * sizeof(int));
|
|
int somme = 0;
|
|
for (int i = 0; i < taille; i++) {
|
|
racines[i] = racineCarre(tab[i]);
|
|
somme += racines[i]; // Calcul somme
|
|
}
|
|
|
|
for (int i = 0; i < taille; i++) {
|
|
if (i % 2 == 0) { // Pair
|
|
result[i] = racines[i];
|
|
} else { // Impair
|
|
result[i] = somme * tab[i];
|
|
}
|
|
}
|
|
|
|
free(racines);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
int main(void) {
|
|
printf("========== Test racineCarre ==========\n");
|
|
printf("racineCarre(9) = %d\n", racineCarre(9));
|
|
printf("racineCarre(10) = %d\n", racineCarre(10));
|
|
printf("\n");
|
|
|
|
printf("========== Test racineCarreTab ==========\n");
|
|
int tab1[] = {9, 25, 4};
|
|
int tab2[] = {10, 36, 2};
|
|
|
|
int* result1 = racineCarreTab(tab1, 3);
|
|
printf("racineCarreTab([9, 25, 4]) = ");
|
|
for (int i = 0; i < 3; i++) {
|
|
printf("%d ", result1[i]);
|
|
}
|
|
printf("\n");
|
|
free(result1);
|
|
|
|
int* result2 = racineCarreTab(tab2, 3);
|
|
printf("racineCarreTab([10, 36, 2]) = ");
|
|
for (int i = 0; i < 3; i++) {
|
|
printf("%d ", result2[i]);
|
|
}
|
|
printf("\n\n");
|
|
free(result2);
|
|
|
|
printf("========== Test TriSpecial ==========\n");
|
|
int tab3[] = {3, 5, 25, 16};
|
|
int* result3 = TriSpecial(tab3, 4);
|
|
printf("TriSpecial([3, 5, 25, 16]) = ");
|
|
for (int i = 0; i < 4; i++) {
|
|
printf("%d ", result3[i]);
|
|
}
|
|
printf("\n");
|
|
free(result3);
|
|
|
|
int tab4[] = {36, 9, 100, 2, 3, 7};
|
|
int* result4 = TriSpecial(tab4, 6);
|
|
printf("TriSpecial([36, 9, 100, 2, 3, 7]) = ");
|
|
for (int i = 0; i < 6; i++) {
|
|
printf("%d ", result4[i]);
|
|
}
|
|
printf("\n\n");
|
|
free(result4);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// int main(void) {
|
|
// Racine carrée
|
|
// printf("%d\n", racineCarre(9));
|
|
// printf("%d\n", racineCarre(16));
|
|
// printf("-----------------\n");
|
|
// donne bien racineCarree(9) → 3 et racineCarree(10) → -1
|
|
|
|
// Racine carrée tab
|
|
// int tab1[] = {9,25,4};
|
|
// int tab2[] = {10,36,2};
|
|
// int* result1 = racineCarreTab(tab1, 3);
|
|
// int* result2 = racineCarreTab(tab2, 3);
|
|
// for (int i = 0; i < 3; i++) {
|
|
// printf("%d ", result1[i]);
|
|
// }
|
|
|
|
// for (int i = 0; i < 3; i++) {
|
|
// printf("%d ", result2[i]);
|
|
// }
|
|
|
|
// Test profiler avec racineCarrreTab
|
|
// int tab[10000];
|
|
// for (int i = 0; i < 10000; i++) {
|
|
// tab[i] = 1000000 + i;
|
|
// }
|
|
|
|
// for (int repeat = 0; repeat < 10000; repeat++) {
|
|
// int* a = racineCarreTab(tab, 10000);
|
|
// free(a);
|
|
// }
|
|
|
|
// Tri spéciale
|
|
// int tab1[] = {3, 5, 25, 16};
|
|
// int* result1 = TriSpecial(tab1, 4);
|
|
// printf("Test 1 : ");
|
|
// for (int i = 0; i < 4; i++) {
|
|
// printf("%d ", result1[i]);
|
|
// }
|
|
// printf("\n");
|
|
// free(result1);
|
|
// // donne bien TriSpecial([3,5,25,16]) → [3,245,25,784]
|
|
|
|
// int tab2[] = {36, 9, 100, 2, 3, 7};
|
|
// int* result2 = TriSpecial(tab2, 6);
|
|
// printf("Test 2 : ");
|
|
// for (int i = 0; i < 6; i++) {
|
|
// printf("%d ", result2[i]);
|
|
// }
|
|
// printf("\n");
|
|
// free(result2);
|
|
// donne bien TriSpecial([36,9,100,2,3,7]) → [6,144,10,32,-1,112]
|
|
|
|
// return 0;
|
|
// }
|
|
|
|
// gcc main.c -o app
|
|
// ./app
|
|
|
|
// (Profiling)
|
|
// gcc -pg main.c -o app
|
|
// ./app
|
|
// gprof "app.exe" gmon.out
|