-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathquestion7.c
More file actions
156 lines (121 loc) · 2.68 KB
/
question7.c
File metadata and controls
156 lines (121 loc) · 2.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <math.h>
#include <pthread.h>
uint64_t nb;
FILE * file;
char str[60];
pthread_t thread0;
pthread_t thread1;
//Gérer l'accès critique au file
pthread_mutex_t lock;
//On code les nombres sur 64 bits donc au pire 64 facteurs (2^0*2¹...)
const int MAX_FACTORS=64;
void print_prime_factors(uint64_t n);
int get_prime_factors(uint64_t n,uint64_t* dest);
void* thread_prime_factors(void * u)
{
pthread_mutex_lock(&lock);
while ( fgets(str, 60, file)!=NULL )
{
nb=atol(str);
pthread_mutex_unlock(&lock);
print_prime_factors(nb);
pthread_mutex_lock(&lock);
}
pthread_mutex_unlock(&lock);
return NULL;
}
void print_prime_factors(uint64_t n)
{
uint64_t factors[MAX_FACTORS];
int j,k;
k=get_prime_factors(n,factors);
if (k ==-1)
{
printf("ERROR : fonction get_prime_factors");
return;
}
printf("%ju: ",n);
for(j=0; j<k; j++)
{
printf("%ju ",factors[j]);
}
printf("\n");
}
int get_prime_factors(uint64_t n,uint64_t* dest)
{
/*****************
* INITIALISATION *
*****************/
int compteur=0; //Garde le nombre de facteurs premiers que l'on rentre dans le tableau
uint64_t i;
/***************
* TESTS POUR 2 *
***************/
while ( n%2 == 0)
{
n=n/2;
dest[compteur]=(uint64_t)2;
compteur++;
}
/***************
* TESTS POUR 3 *
***************/
while ( n%3 == 0)
{
n=n/3;
dest[compteur]=(uint64_t)3;
compteur++;
}
/***************
* TESTS POUR 5 *
***************/
while ( n%5 == 0)
{
n=n/5;
dest[compteur]=(uint64_t)5;
compteur++;
}
/************************************************************
* TESTS POUR LE RESTE DES FACTEURS PREMIERS EN PARTANT DE 7 *
************************************************************/
for( i=7; n!=1 ; i++ )
// On supprime les multiples de 2 et de 3 en incrementant alternativement
// i de 4 et de 2
{
while (n%i==0)
{
// Tant que i est un facteur premier de n
n=n/i;
dest[compteur]=i;
compteur++;
}
}
if(n!=1)
{
dest[compteur]=n;
compteur++;
}
return compteur;
}
int main(void)
{
file = fopen ("fileQuestion9.txt","r");
if (pthread_mutex_init(&lock, NULL) != 0)
{
printf("\n mutex init failed\n");
return 1;
}
//Attention en C l'appel des méthode est synchrone donc il faut d'abord créer un thread
//avant d'appeler des fonctions dans le main
pthread_create(&thread0, NULL, thread_prime_factors, NULL);
pthread_create(&thread1, NULL, thread_prime_factors, NULL);
//Wait for the thread0 to be done
pthread_join(thread0, NULL);
pthread_join(thread1, NULL);
pthread_mutex_destroy(&lock);
return 0;
}