Advertisement
Guest User

Untitled

a guest
Oct 16th, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.67 KB | None | 0 0
  1. //
  2. // Created by Mihai Anton on 08/10/2019.
  3. //
  4.  
  5. #include <thread>
  6. #include <iostream>
  7. #include "numberSum.h"
  8.  
  9.  
  10. using namespace std;
  11.  
  12.  
  13. void printVec(vector<int> v){
  14. for(int i:v){
  15. cout << i << " ";
  16. }
  17. cout << "\n";
  18. }
  19.  
  20. void numberSumSequential(vector<int>* a, vector<int>* b,vector<int>* result){
  21.  
  22. int carry = 0, sum = 0;
  23. for(int i=0;i<(*a).size();i++){
  24. sum = (*a)[i] + (*b)[i] + carry;
  25. (*result)[i] = sum%10;
  26. carry = sum/10;
  27. }
  28. if(carry){
  29. (*result).push_back(1);
  30. }
  31. }
  32.  
  33.  
  34. void threadWork(vector<int>* a, vector<int>* b, vector<int>* result, int start,int stop,bool* extra){
  35.  
  36. bool done = false;
  37. while(start < stop && !done){
  38. if(((*a)[start] + (*b)[start]) > 9){ //current position causes carry
  39. if(start+1<result->size()) {
  40. (*result)[start + 1] = ((*a)[start+1] + (*b)[start+1] + 1)%10;
  41. }
  42. else if(start+1==result->size()){
  43. *extra = true;
  44. return;
  45. }
  46. start += 1;
  47. while(((*a)[start] + (*b)[start]) == 9){ //while there are chained maybes after the carry
  48. if(start + 1 < result->size()){
  49. (*result)[start + 1] = ((*a)[start+1] + (*b)[start+1] + 1)%10;
  50. }
  51. else if(start + 1 == result->size()){
  52. *extra = true;
  53. return;
  54. }
  55. start += 1;
  56. }
  57.  
  58. }
  59. else{ //maybe (not coming after carry) or never
  60. if(start+1<result->size() && (*result)[start + 1]==-1) {
  61. (*result)[start + 1] = ((*a)[start+1] + (*b)[start+1])%10;
  62. }
  63. start += 1;
  64. }
  65. }
  66.  
  67. }
  68. void numberSumParallel(vector<int>* a, vector<int>* b,vector<int>* result,int threadCount,bool debug = false) {
  69.  
  70. vector<thread> threads(threadCount);
  71. bool extra = false;
  72.  
  73. int sharePerThread = int(result->size()/threadCount);
  74. int remain = result->size()%threadCount;
  75. int start = 0;
  76. int stop = 0;
  77. for(int i=0;i<threadCount;i++){
  78. stop = start + sharePerThread;
  79. if(remain > 0){
  80. stop ++;
  81. remain --;
  82. }
  83.  
  84. threads[i] = thread(threadWork,a,b,result,start,stop,&extra);
  85.  
  86. start = stop;
  87. }
  88.  
  89. for(int i=0;i<threadCount;i++){
  90. threads[i].join();
  91. }
  92. (*result)[0] = ((*a)[0] + (*b)[0])%10;
  93. if(extra){
  94. (*result).push_back(1);
  95. }
  96.  
  97. // //step1: mark Never(0), Carry(2) and Maybe(1)
  98. //
  99. // vector<thread> threads;
  100. // for(int i=0;i<threadCount;i++){
  101. // thread th(threadStep1,a,b,result,i,threadCount);
  102. // threads.push_back(move(th));
  103. // }
  104. //
  105. // for(int i=0;i<threadCount;i++){
  106. // threads[i].join();
  107. // }
  108. //
  109. // if(debug) {
  110. // cout << "s1 ";
  111. // printVec(*result);
  112. // cout << "\n";
  113. // }
  114. //
  115. //// ///step2:
  116. //// threads.clear();
  117. //// for(int i=0;i<threadCount;i++){
  118. //// thread th(threadStep2,result,aux,i+1,threadCount);
  119. //// threads.push_back(move(th));
  120. //// }
  121. ////
  122. //// for(int i=0;i<threadCount;i++){
  123. //// threads[i].join();
  124. //// }
  125. //// (*aux)[0] = (*result)[0];
  126. ////
  127. //// if(debug) {
  128. //// cout << "s2 ";
  129. //// printVec(*aux);
  130. //// cout << "\n";
  131. //// }
  132. // for(int i=0;i<result->size();i++){
  133. // (*aux)[i] = (*result)[i];
  134. // }
  135. //
  136. // ///step3: setting 1 for each carry
  137. // threads.clear();
  138. // for(int i=0;i<threadCount;i++){
  139. // thread th(threadStep3,aux,result,i,threadCount);
  140. // threads.push_back(move(th));
  141. // }
  142. //
  143. // for(int i=0;i<threadCount;i++){
  144. // threads[i].join();
  145. // }
  146. // (*result)[0] = 0;
  147. // if(debug) {
  148. // cout << "s3 ";
  149. // printVec(*result);
  150. // cout << "\n";
  151. // }
  152. //
  153. // bool extraCarry = false;
  154. // if((*aux)[(*aux).size()-1] == 2){
  155. // extraCarry = true;
  156. // }
  157. //
  158. // ///step4: sum a + b + result(that keeps the carry for each position)
  159. // threads.clear();
  160. // for(int i=0;i<threadCount;i++){
  161. // thread th(threadStep4,a,b,result,i,threadCount);
  162. // threads.push_back(move(th));
  163. // }
  164. //
  165. // for(int i=0;i<threadCount;i++){
  166. // threads[i].join();
  167. // }
  168. //
  169. // if(extraCarry){
  170. // (*result).push_back(1);
  171. // }
  172.  
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement