Advertisement
Guest User

Untitled

a guest
Nov 20th, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.10 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main() {
  5.     int n, ndiv = 1;
  6.     int x;
  7.     while(n/ndiv != 0){ // ndiv e kolku mesta zafakje N, za da deleme za cifrata
  8.         ndiv*=10;
  9.     }
  10.     ndiv/=10;
  11.     cin>>n>>x;
  12.     int avail = 0;
  13.     while(x>0){
  14.         avail |= 1<<(x%10); // koristi gi bitovite kak niza, 00010001 znaci oti ima 4 i 8 u X
  15.         x/=10;
  16.     }
  17.     int hi = 0, low = 9;
  18.     for(int i=0;i<=9;i++){ // terame najgolema i najmalenka cifra so ne e u X
  19.         if(!(avail & 1 << i)){
  20.             cout<<i<<" ";
  21.             hi = max(hi, i);
  22.             low = max(low, i);
  23.         }
  24.     }
  25.     cout<<hi<<" "<<low<<endl;
  26.     int big = 0, small = 0; // navagjame 2 resenija, 1 pogolem i 1 pomalecok od N
  27.     int start = n / ndiv;
  28.     n %= ndiv;
  29.     ndiv/=10;
  30.     while(!(avail & 1 << start)){ // dodeka mozeme da drzeme isti cifri so N
  31.         big += start;
  32.         big *= 10;
  33.         small += start;
  34.         small *=10;
  35.         start = n / ndiv;
  36.         n%=ndiv;
  37.         ndiv /= 10;
  38.     }
  39.     int stop = 0;
  40.     for(int i=0; i<=9; i++){ // tuka ni e prvata cifra so nemozeme da ga dodademe, u small staj pomalenkio broj u big pogolemio
  41.         if(start-i>=0){
  42.             if(!(avail & 1 << (start-i))){
  43.                 stop += 1;
  44.                 small += start-i;
  45.                 small *= 10;
  46.             }
  47.         }
  48.         if(start+i<=9){
  49.             if(!(avail & 1 << (start+i))){
  50.                 stop += 1;
  51.                 big += start+i;
  52.                 big *= 10;
  53.             }
  54.         }
  55.         if(stop>0){ // prekrsuvame for-o oti i ni e kolku e razlikata megju cifrite, nema smisla da prodolzeme
  56.             break;
  57.         }
  58.     }
  59.     if(stop == 0){ // ne sme prekrsile for-o gore, nema resenie zadacata. primer x=1234567890, nikojpat ke nema resenie
  60.         cout<<"NO SOLUTION"<<endl;
  61.         return 0;
  62.     }
  63.     ndiv/=10;
  64.     while(ndiv){ // dodeka N ima cifri, dodavi ga najmalenkata cifra na pogolemio broj, najgolemata na pomalenkio
  65.         big += low;
  66.         big *= 10;
  67.         small += hi;
  68.         small *= 10;
  69.         ndiv /= 10;
  70.     }
  71.     small += hi;
  72.     big += low;
  73.     if(n-small > big-n){ // vij dali pogolemio ili pomalenkio broj e poblisko do N
  74.         cout<<big<<endl;
  75.     }
  76.     else{
  77.         cout<<small<<endl;
  78.     }
  79.     return 0;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement