Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- typedef unsigned long long uint64_t;
- uint64_t find_b(uint64_t a, uint64_t target, uint64_t digits) {
- uint64_t guessDigit = 0;
- uint64_t guessLen = 0;
- uint64_t result = 0;
- for(int j=0;j<digits;j++){
- uint64_t p10=pow(10,1+guessLen); //base 10 shift by 10^n divison.
- uint64_t p10d=p10/10;
- for(uint64_t b=0;b<10;b++){ //test every base 10 digit
- uint64_t bg = b*p10d+result; //concatenate b-guess to lead of result, b=2 result=39 -> 2*100+39 -> 239
- uint64_t product = a * bg;
- if( (product%p10) == (target%p10) ){ //same trailing digits
- guessDigit=b;
- break;
- }
- }
- result+=guessDigit*(p10/10); //concat
- guessLen++;
- }
- return result;
- }
- int main() {
- for(uint a=1;a<32;a++){ //a is chosen
- uint64_t target = 13238717; // Target 10-adic number
- uint64_t leadingDigits = 6; //leading digits after minimum required precision
- uint64_t digits = log10(target)+1+leadingDigits; //target digit count
- uint64_t mod = pow(10, digits ); // ignore imprecise digits e.g. 3 * 33337746239 = 100013238717 -> ...00013238717
- uint64_t b = find_b(a, target, digits);
- std::string leadingZeros="";
- for(uint64_t i=0; i<leadingDigits;i++){
- leadingZeros+="0";
- }
- uint64_t approx = (a * b) % mod;
- if ( approx == target ) { //exclude impossible ones
- std::cout << a << " * ..." << b << " = ..." << leadingZeros << approx << std::endl;
- }
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment