Cod sursa(job #1244299)

Utilizator karlaKarla Maria karla Data 17 octombrie 2014 02:08:12
Problema Radix Sort Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <stdio.h>
FILE*f=fopen("radixsort.in","r"),*g=fopen("radixsort.out","w");

# define NR 10000003

long n,v[NR][10],maxim=0,ord[NR],nr[NR];
long b,a,c;


using namespace std;

void citire()
{
    fscanf(f,"%ld %ld %ld %ld",&n,&a,&b,&c);
}

void impartire(long x,long i)
{
    while(x!=0)
    {
        v[i][0]++;
        v[i][v[i][0]]=x%10;
        x=x/10;
    }
    if(maxim<v[i][0])
        maxim=v[i][0];
}



void generare()
{
    long x,x1;
    impartire(b,1);
    x1=b;
    for(long i=2;i<=n;i++)
    {
        x=(a*x1+b)%c;
        impartire(x,i);
        ord[i]=i;
        x1=x;
    }

    /*long x;
    fscanf(f,"%ld",&n);
    for(long i=1;i<=n;i++)
    {
        fscanf(f,"%ld ",&x);
        impartire(x,i);
        ord[i]=i;
    }*/

}

void da_cu_0(long s[])
{
    for(long i=0;i<=10;i++)
    {
        s[i]=0;
    }
}

void ordonare()
{
    long s[10];
        for(long j=1;j<=maxim;j++)
        {
            da_cu_0(s);
            // fregvente cifre
            for(long i=1;i<=n;i++)
            {
                s[v[i][j]]++;
            }
            // sume partiale
            for(long i=1;i<=10;i++)
            {
                s[i]+=s[i-1];
            }
            // ordonare
            for(long i=n;i>=1;i--)
            {
                nr[s[v[ord[i]][j]]]=ord[i];
                s[v[ord[i]][j]]--;
            }
            // copiere
            for(long i=1;i<=n;i++)
            {
                ord[i]=nr[i];
            }
        }
}

void afisare()
{
    for(long i=1;i<=n;i++)
    {
        if(i%10==1)
        {
            for(long j=v[ord[i]][0];j>=1;j--)
                fprintf(g,"%ld",v[ord[i]][j]);
            fprintf(g," ");
        }

    }
}

int main()
{
    citire();
    generare();
    ordonare();
    afisare();
    return 0;
}