Cod sursa(job #115314)

Utilizator alecmanAchim Ioan Alexandru alecman Data 16 decembrie 2007 12:08:50
Problema Multiplu Scor 10
Compilator cpp Status done
Runda preONI 2008, Runda 2, Clasa a 10-a Marime 2.12 kb
/*
 *
 *
   infoarena 2.0 - preONI 2008 - Runda 2
 *
 *
 */

#include<stdio.h>

#define INPUT "multiplu.in"
#define OUTPUT "multiplu.out"

FILE *fin=fopen(INPUT, "r"),*fout=fopen(OUTPUT, "w");

long long a,b,numar,nrInmult,multiplu;

void readValues();
long long determinaZero();
long long cmmdc(long long, long long);
void determinaMultiplu();
int valid(long long);
void printSolution(long long);

int main(){
  readValues();
  numar = determinaZero();
  if(a>b){
    multiplu = a*b / cmmdc(a,b);
  }
  else{
    multiplu = a*b / cmmdc(b,a);
  }
  determinaMultiplu();
  fclose(fin);
  fclose(fout);
  return 0;
}

void readValues(){
  fscanf(fin, "%lld %lld", &a, &b);
}

long long cmmdc(long long val1, long long val2){
  long long r=0;
  while(val2!=0){
    r=val1%val2;
    val1=val2;
    val2=r;
  }
  return val1;
}

long long determinaZero(){
  long long cont1,cont2,zeroDoi,zeroCinci;
  cont1 = 0;
  while(a%2==0){
    ++cont1;
    a/=2;
  }
  cont2 = 0;
  while(b%2==0){
    ++cont2;
    b/=2;
  }
  if(cont1>cont2){
    zeroDoi = cont1;
  }
  else{
    zeroDoi = cont2;
  }
  cont1 = 0;
  cont2 = 0;
  while(a%5==0){
    ++cont1;
    a/=5;
  }
  while(b%5==0){
    ++cont2;
    b/=5;
  }
  if(cont1>cont2){
    zeroCinci = cont1;
  }
  else{
    zeroCinci = cont2;
  }
  if(zeroDoi>zeroCinci){
    return zeroDoi;
  }
  else{
    return zeroCinci;
  }
}

void determinaMultiplu(){
  int r;
  r = multiplu%10;
  switch(r){
    case 1: nrInmult = 1; break;
    case 3: nrInmult = 7; break;
    case 7: nrInmult = 3; break;
    case 9: nrInmult = 9; break;
  }
  long long nrValid;
  nrValid = multiplu * nrInmult;
  while(!valid(nrValid)){
    nrInmult+=10;
    nrValid = multiplu * nrInmult;
  }
  printSolution(nrValid);
}

void printSolution(long long val){
  fprintf(fout, "%lld", val);
  for(long long i=1;i<=numar;++i){
    fprintf(fout, "0");
  }
  fprintf(fout, "\n");
}

int valid(long long val){
  long long temp;
  temp = val;
  while(temp!=0){
    if(temp%10>1){
      return 0;
    }
    temp/=10;
  }
  return 1;
}