Pagini recente » Cod sursa (job #2863698) | Cod sursa (job #2530966) | Cod sursa (job #251186) | Cod sursa (job #2077135) | Cod sursa (job #1108952)
#include <vector>
#include <queue>
#include <fstream>
using namespace std;
int num_digits(int n) {
int len = 1;
while ( n/10 ) {
len++;
n /= 10;
}
return len;
}
int main() {
vector<queue<int>> queues(10);
int N, A, B, C;
ifstream in("radixsort.in");
in >> N >> A >> B >> C;
in.close();
vector<int> v(N);
v[0] = B;
int max_len = num_digits(v[0]);
// building input vector
for (int i = 1; i < N; i++) {
v[i] = ((long long)A*v[i - 1] + B) % C;
// keeping track of the longest number
int num_len = num_digits(v[i]);
if (num_len > max_len){
max_len = num_len;
}
}
int n = 10;
int m = 1;
vector<int>::iterator vIter;
for (int i = 0; i < max_len; i++) {
for (vIter = v.begin(); vIter != v.end(); vIter++) {
queues[(*vIter % n) / m].push(*vIter);
}
int k = 0;
vector<queue<int>>::iterator qIter;
for (qIter = queues.begin(); qIter != queues.end(); qIter++) {
while (!(*qIter).empty()) {
v[k++] = (*qIter).front();
(*qIter).pop();
}
}
n *= 10;
m *= 10;
}
ofstream out("radixsort.out");
for (int i = 0; i < N; i += 10) {
out << v[i] << " ";
}
out.close();
}