#include #include // 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