#include #include #include #include #include #include #include bool isVampireNumber( long number, std::vector > & solution ) { std::ostringstream numberstream ; numberstream << number ; std::string numberstring( numberstream.str( ) ) ; std::sort ( numberstring.begin( ) , numberstring.end( ) ) ; int fanglength = numberstring.length( ) / 2 ; long start = static_cast( std::pow( 10 , fanglength - 1 ) ) ; long end = sqrt(number) ; for ( long i = start ; i <= end ; i++ ) { if ( number % i == 0 ) { long quotient = number / i ; if ( ( i % 10 == 0 ) && ( quotient % 10 == 0 ) ) continue ; numberstream.str( "" ) ; //clear the number stream numberstream << i << quotient ; std::string divisorstring ( numberstream.str( ) ) ; std::sort ( divisorstring.begin( ) , divisorstring.end( ) ) ; if ( divisorstring == numberstring ) { std::pair divisors = std::make_pair( i, quotient ) ; solution.push_back( divisors ) ; } } } return !solution.empty( ) ; } void printOut( const std::pair & solution ) { std::cout << "[ " << solution.first << " , " << solution.second << " ]" ; } int main( ) { int vampireNumbersFound = 0 ; std::vector > solutions ; double i = 1.0 ; while ( vampireNumbersFound < 25 ) { long start = static_cast( std::pow( 10 , i ) ) ; long end = start * 10 ; for ( long num = start ; num < end ; num++ ) { if ( isVampireNumber( num , solutions ) ) { vampireNumbersFound++ ; std::cout << vampireNumbersFound << " :" << num << " is a vampire number! These are the fangs:\n" ; std::for_each( solutions.begin( ) , solutions.end( ) , printOut ) ; std::cout << "\n_______________" << std::endl ; solutions.clear( ) ; if ( vampireNumbersFound == 25 ) break ; } } i += 2.0 ; } std::vector testnumbers ; testnumbers.push_back( 16758243290880 ) ; testnumbers.push_back( 24959017348650 ) ; testnumbers.push_back( 14593825548650 ) ; for ( std::vector::const_iterator svl = testnumbers.begin( ) ; svl != testnumbers.end( ) ; svl++ ) { if ( isVampireNumber( *svl , solutions ) ) { std::cout << *svl << " is a vampire number! The fangs:\n" ; std::for_each( solutions.begin( ) , solutions.end( ) , printOut ) ; std::cout << std::endl ; solutions.clear( ) ; } else { std::cout << *svl << " is not a vampire number!" << std::endl ; } } return 0 ; }