1. 程式人生 > >Project Euler Problem 52 (C++和Python)

Project Euler Problem 52 (C++和Python)

Problem 52: Permuted multiples

It can be seen that the number, 125874, and its double, 251748, contain exactly the same digits, but in a different order.

Find the smallest positive integer, x, such that 2x, 3x, 4x, 5x, and 6x, contain the same digits.

C++ source code

#include <iostream>
#include <set> #include <cassert> using namespace std; class PE0052 { public: set<int> getDigits(int x, int multiple); void findSmallestPositiveInteger(); }; set<int> PE0052::getDigits(int x, int multiple) { set<int> digits_s; x *= multiple; while(x>
0) { digits_s.insert(x % 10); x /= 10; } return digits_s; } void PE0052::findSmallestPositiveInteger() { for (int n=100000; n<1000000; n++) { if ((getDigits(n, 1) == getDigits(n, 2)) && (getDigits(n, 2) == getDigits(n, 3)) && (
getDigits(n, 3) == getDigits(n, 4)) && (getDigits(n, 4) == getDigits(n, 5)) && (getDigits(n, 5) == getDigits(n, 6))) { cout << "The smallest positive integer " << n << ", x, "; cout << "2x, 3x, 4x, 5x and 6x, contain the same digits." << endl; break; } } } int main() { PE0052 pe0052; assert(pe0052.getDigits(125874,1)==pe0052.getDigits(125874,2)); pe0052.findSmallestPositiveInteger(); return 0; }

Python source code

def getDigitsString(x, multiple):
    return sorted(str(multiple*x))

def findSmallestPositiveInteger():
    for x in range(10**5, 10**6):
        if getDigitsString(x, 1) == getDigitsString(x, 2) and \
           getDigitsString(x, 2) == getDigitsString(x, 3) and \
           getDigitsString(x, 3) == getDigitsString(x, 4) and \
           getDigitsString(x, 4) == getDigitsString(x, 5) and \
           getDigitsString(x, 5) == getDigitsString(x, 6):
            return x
    return 0

def main():
    assert getDigitsString(125874, 1) == getDigitsString(125874, 2)
    print("The smallest integer",findSmallestPositiveInteger(),\
		  ", multiples from 1 to 6, contain the same digits.")

if  __name__ == '__main__':
    main()