Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- int main() {
- int n, ndiv = 1;
- int x;
- while(n/ndiv != 0){ // ndiv e kolku mesta zafakje N, za da deleme za cifrata
- ndiv*=10;
- }
- ndiv/=10;
- cin>>n>>x;
- int avail = 0;
- while(x>0){
- avail |= 1<<(x%10); // koristi gi bitovite kak niza, 00010001 znaci oti ima 4 i 8 u X
- x/=10;
- }
- int hi = 0, low = 9;
- for(int i=0;i<=9;i++){ // terame najgolema i najmalenka cifra so ne e u X
- if(!(avail & 1 << i)){
- cout<<i<<" ";
- hi = max(hi, i);
- low = max(low, i);
- }
- }
- cout<<hi<<" "<<low<<endl;
- int big = 0, small = 0; // navagjame 2 resenija, 1 pogolem i 1 pomalecok od N
- int start = n / ndiv;
- n %= ndiv;
- ndiv/=10;
- while(!(avail & 1 << start)){ // dodeka mozeme da drzeme isti cifri so N
- big += start;
- big *= 10;
- small += start;
- small *=10;
- start = n / ndiv;
- n%=ndiv;
- ndiv /= 10;
- }
- int stop = 0;
- 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
- if(start-i>=0){
- if(!(avail & 1 << (start-i))){
- stop += 1;
- small += start-i;
- small *= 10;
- }
- }
- if(start+i<=9){
- if(!(avail & 1 << (start+i))){
- stop += 1;
- big += start+i;
- big *= 10;
- }
- }
- if(stop>0){ // prekrsuvame for-o oti i ni e kolku e razlikata megju cifrite, nema smisla da prodolzeme
- break;
- }
- }
- if(stop == 0){ // ne sme prekrsile for-o gore, nema resenie zadacata. primer x=1234567890, nikojpat ke nema resenie
- cout<<"NO SOLUTION"<<endl;
- return 0;
- }
- ndiv/=10;
- while(ndiv){ // dodeka N ima cifri, dodavi ga najmalenkata cifra na pogolemio broj, najgolemata na pomalenkio
- big += low;
- big *= 10;
- small += hi;
- small *= 10;
- ndiv /= 10;
- }
- small += hi;
- big += low;
- if(n-small > big-n){ // vij dali pogolemio ili pomalenkio broj e poblisko do N
- cout<<big<<endl;
- }
- else{
- cout<<small<<endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement