Listing Functii.PAS
Program FunctiiSurj;
#include <stdio.h>
#include <string.h>
class N {
private:
int c[127],n; N prod(int);
void transp(int); void init0();
public:
N (unsigned long =0); N (char *);
N& operator+=(N&); N& operator*=(N&);
N& operator<<=(int);
friend N operator+(N&,N&);
friend N operator*(N&,N&);
friend N operator<<(N&,int);
friend void scrie(N&,FILE*);
};
N::N(unsigned long x){
init0();
for (n=0;x;n++) c[n]=x % 10, x/=10;
}
N::N(char* x){
init0(); n=strlen(x);
for (int i=0,nn=n-1;x[i];i++)
c[nn-i]=x[i]-'0';
}
void N::init0(){
for (int i=0;i<128;i++) c[i]=0;n=1;
}
N N::prod(int x){
int i,t,s; N z=*this;
for (i=t=0;i<n;i++){
(s=x*z.c[i]+t)>9 ?
(t=s/10,s %=10):(t=0);
z.c[i]=s;
}
z.transp(t); return z;
}
void N::transp(int t){
if(t) c[n]=t,n++;
}
N& N::operator+=(N& x){
int i,t,s;if(n<x.n) n=x.n;
for (i=t=0;i<n;i++){
(s=c[i]+x.c[i]+t)>9 ?
(t=1,s-=10):(t=0); c[i] = s;
}
transp(t);
return *this;
}
N& N::operator*=(N& x){
N s;
for (int i=0;i<x.n;i++)
if (x.c[i]) s+=(prod(x.c[i])<<i);
return *this=s;
}
N& N::operator<<=(int x){
if (x){
for (int i=n-1;i>=0;i--) c[i+x]=c[i];
for(i=0;i<x;i++) c[i]=0; n+= x;
}
return *this;
}
N operator+ (N& x, N& y)
{ N z=x;z+=y; return z;}
N operator* (N& x, N& y)
{ N z=x;z*=y;return z;}
N operator<<(N& x,int y)
{ N z=x;z<<=y;return z;}
void scrie(N& x, FILE *f){
for(int i = x.n - 1; i >= 0; i--)
fprintf(f, "%d", x.c[i]);
fputc('\n', f);
} void main()
{ N s[27],f[27],ss[10];
s[1]=f[1]=1;
int k,n,nr=0,i,j=0,nn[10],kk[10],
necalc[10];
char a[27],b[27],s0[]="0";
FILE *f1,*f2;
f1=fopen("in.txt","rt");
f2=fopen("out.txt","wt");
fscanf(f1,"%s%s",a,b);
nn[nr]=strlen(a);
kk[nr]=strlen(b);
if (nn[nr]>=kk[nr]) necalc[nr]=1;
else necalc[nr]=0;
nr++; fclose(f1);
for (n=2;n<27;n++) {
s[n]=1;f[n]=n*f[n-1];
for (k=n-1;k>1;k--)
s[k]=s[k-1]+k*s[k];
for (i=0;i<nr;i++)
if (n == nn[i] && necalc[i])
{ss[i]=s[kk[i]]*f[kk[i]];j++;}
if (j == nr) break;
}
for(i=0;i<nr;i++)
if (necalc[i]) scrie(ss[i],f2);
else fprintf(f2,"%s\n",s0);
fclose(f2);
}
Pentru a mări interesul pentru Java, vom prezenta o rezolvare în acest limbaj, propusă de Mihai Scorțaru, student, Universitatea Tehnică din Cluj:
import java.math.*;
import java.io.*;
class FunctiiSurjective{
public static void main(String args[]){
try{
BufferedReader br=new BufferedReader
(new InputStreamReader
(new FileInputStream("in.txt")));
String s=br.readLine();
int x=s.length();
s=br.readLine();
int y=s.length();
BigInteger[] a=new BigInteger[27];
BigInteger[] b=new BigInteger[27];
for (int i=0;i<27;i++){
a[i]=new BigInteger("0");
b[i]=new BigInteger("0");
}
a[1]=new BigInteger("1");
for (int i=2;i<=x;i++){
for (int j=1;j<=i;j++)
b[i]=(a[i].multiply(new BigInteger
(Integer.toString(j)))).add
(a[i-1].multiply(new BigInteger
(Integer.toString(j))));
for (int j=1;j<=i;j++) a[i]=b[i];
}
PrintWriter pw=new PrintWriter
(new FileOutputStream("out.txt"),true);
pw.println(b[y]);
} catch (IOException ioe)
{System.out.println("IO Error");}
}
}