#include <iostream>
unsigned long long getClosestWith7( unsigned long long n, unsigned int k)
{
// Count number of digits
unsigned long long tmp = n;
unsigned int m = 0 , mK = 0 ;
while ( tmp > 0 )
{
if ( tmp % 10 == 7 ) mK++ ;
tmp / = 10 ;
m++ ;
}
// Distinct cases
if ( k == mK && n ! = 0 )
return n;
else if ( k >= m || n == 0 ) // implicit: k != mK
{
unsigned long long r = 0 ;
while ( k > 0 )
{
r = 10 * r + 7 ;
k-- ;
}
return r;
}
else if ( k > mK) // implicit: k != mK, k < m
{
unsigned long long r = n;
unsigned long long s = 0 ;
m = 0 ;
while ( mK < k)
{
if ( r % 10 ! = 7 ) mK++ ;
r / = 10 ;
m++ ;
}
if ( r % 10 == 8 ) // special case
s = 79 + 100 * ( r / 10 ) ;
while ( m > 0 )
{
r = 10 * r + 7 ;
if ( s ! = 0 && m > 1 ) // special case
s = 10 * s + 7 ;
m-- ;
}
return ( r < n && n - r < n - s) || ( r >= n && r - n < n - s) ? r : s;
}
else // implicit : k < mK
{
// Generate a and b
unsigned long long a = n;
unsigned long long b = 0 ;
m = 0 ;
while ( mK > k)
{
if ( a % 10 == 7 ) mK-- ;
a / = 10 ;
m++ ;
}
b = 10 * a + 8 ;
a = 10 * a + 6 ;
m-- ;
while ( m > 0 )
{
a = 10 * a + 9 ;
b = 10 * b + 0 ;
m-- ;
}
// Compare (return lowest if equal)
return n - a <= b - n ? a : b;
}
}
#define CLOSEST7( N , K ) \
std::cout << "N = " << N << ", K = " << K << " => N' = " << getClosestWith7(N,K) << "\n"
int main( )
{
CLOSEST7( 1773 ,3 ) ;
CLOSEST7( 83 ,1 ) ;
CLOSEST7( 17273 ,3 ) ;
CLOSEST7( 1273679750 ,6 ) ;
CLOSEST7( 1773 ,1 ) ;
CLOSEST7( 83 ,5 ) ;
CLOSEST7( 0 ,2 ) ;
CLOSEST7( 0 ,0 ) ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKCnVuc2lnbmVkIGxvbmcgbG9uZyBnZXRDbG9zZXN0V2l0aDcodW5zaWduZWQgbG9uZyBsb25nIG4sIHVuc2lnbmVkIGludCBrKQp7CiAgICAvLyBDb3VudCBudW1iZXIgb2YgZGlnaXRzCiAgICB1bnNpZ25lZCBsb25nIGxvbmcgdG1wID0gbjsKICAgIHVuc2lnbmVkIGludCBtID0gMCwgbUsgPSAwOwogICAgd2hpbGUodG1wID4gMCkKICAgIHsKICAgICAgICBpZih0bXAgJSAxMCA9PSA3KSBtSysrOwogICAgICAgIHRtcCAvPSAxMDsKICAgICAgICBtKys7CiAgICB9CiAgICAKICAgIC8vIERpc3RpbmN0IGNhc2VzCiAgICBpZihrID09IG1LICYmIG4gIT0gMCkKICAgICAgICByZXR1cm4gbjsKICAgIGVsc2UgaWYoayA+PSBtIHx8IG4gPT0gMCkgLy8gaW1wbGljaXQ6IGsgIT0gbUsKICAgIHsKICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgciA9IDA7CiAgICAgICAgd2hpbGUoayA+IDApCiAgICAgICAgewogICAgICAgICAgICByID0gMTAgKiByICsgNzsKICAgICAgICAgICAgay0tOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcjsKICAgIH0KICAgIGVsc2UgaWYoayA+IG1LKSAvLyBpbXBsaWNpdDogayAhPSBtSywgayA8IG0KICAgIHsKICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgciA9IG47CiAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHMgPSAwOwogICAgICAgIG0gPSAwOwogICAgICAgIHdoaWxlKG1LIDwgaykKICAgICAgICB7CiAgICAgICAgICAgIGlmKHIgJSAxMCAhPSA3KSBtSysrOwogICAgICAgICAgICByIC89IDEwOwogICAgICAgICAgICBtKys7CiAgICAgICAgfQogICAgICAgIGlmKHIgJSAxMCA9PSA4KSAvLyBzcGVjaWFsIGNhc2UKICAgICAgICAgICAgcyA9IDc5ICsgMTAwICogKHIgLyAxMCk7CiAgICAgICAgd2hpbGUobSA+IDApCiAgICAgICAgewogICAgICAgICAgICByID0gMTAgKiByICsgNzsKICAgICAgICAgICAgaWYocyAhPSAwICYmIG0gPiAxKSAvLyBzcGVjaWFsIGNhc2UKICAgICAgICAgICAgICAgIHMgPSAxMCAqIHMgKyA3OwogICAgICAgICAgICBtLS07CiAgICAgICAgfQogICAgICAgIHJldHVybiAociA8IG4gJiYgbiAtIHIgPCBuIC0gcykgfHwgKHIgPj0gbiAmJiByIC0gbiA8IG4gLSBzKSA/IHIgOiBzOwogICAgfQogICAgZWxzZSAvLyBpbXBsaWNpdCA6IGsgPCBtSwogICAgewogICAgICAgIC8vIEdlbmVyYXRlIGEgYW5kIGIKICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgYSA9IG47CiAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIGIgPSAwOwogICAgICAgIG0gPSAwOwogICAgICAgIHdoaWxlKG1LID4gaykKICAgICAgICB7CiAgICAgICAgICAgIGlmKGEgJSAxMCA9PSA3KSBtSy0tOwogICAgICAgICAgICBhIC89IDEwOwogICAgICAgICAgICBtKys7CiAgICAgICAgfQogICAgICAgIGIgPSAxMCAqIGEgKyA4OwogICAgICAgIGEgPSAxMCAqIGEgKyA2OwogICAgICAgIG0tLTsKICAgICAgICB3aGlsZShtID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGEgPSAxMCAqIGEgKyA5OwogICAgICAgICAgICBiID0gMTAgKiBiICsgMDsKICAgICAgICAgICAgbS0tOwogICAgICAgIH0KCiAgICAgICAgLy8gQ29tcGFyZSAocmV0dXJuIGxvd2VzdCBpZiBlcXVhbCkKICAgICAgICByZXR1cm4gbiAtIGEgPD0gYiAtIG4gPyBhIDogYjsKICAgIH0KfQoKI2RlZmluZSBDTE9TRVNUNyggTiAsIEsgKSBcCiAgICBzdGQ6OmNvdXQgPDwgIk4gPSAiIDw8IE4gPDwgIiwgSyA9ICIgPDwgSyA8PCAiID0+IE4nID0gIiA8PCBnZXRDbG9zZXN0V2l0aDcoTixLKSA8PCAiXG4iCiAgICAKaW50IG1haW4oKQp7CiAgICBDTE9TRVNUNygxNzczLDMpOwogICAgQ0xPU0VTVDcoODMsMSk7CiAgICBDTE9TRVNUNygxNzI3MywzKTsKICAgIENMT1NFU1Q3KDEyNzM2Nzk3NTAsNik7CiAgICBDTE9TRVNUNygxNzczLDEpOwogICAgQ0xPU0VTVDcoODMsNSk7CiAgICBDTE9TRVNUNygwLDIpOwogICAgQ0xPU0VTVDcoMCwwKTsKfQ==
stdout
N = 1773, K = 3 => N' = 1777
N = 83, K = 1 => N' = 79
N = 17273, K = 3 => N' = 17277
N = 1273679750, K = 6 => N' = 1273677777
N = 1773, K = 1 => N' = 1769
N = 83, K = 5 => N' = 77777
N = 0, K = 2 => N' = 77
N = 0, K = 0 => N' = 0