找出乘积的每个数字与乘数不重复

来源:互联网 发布:java使用redis做缓存 编辑:程序博客网 时间:2024/04/30 04:40

早上起来看瞎逛,看了个题目,

找出这样的数:
    1. 6位正整数
    2. 每个数位上的数字不同
    3. 其平方数的每个数位不含原数字的任何组成数位

如: 203879 * 203879 = 41566646641

    203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。

简单的解法(其实有优化的方法,但不适合编程)

#include <iostream>#include <vector>#include <algorithm>void num2vector(long long num, std::vector<int> &vNum){    while (num > 0)    {        vNum.push_back(num % 10);        num /= 10;    }}int main(int argc, char *argv[]){    long long a = 0;    long long b = 0;    std::vector<int> vA, vB, vC;    std::vector<int>::iterator vit;        for (a = 100000; a < 1000000; a++)    {        if (vA.size() > 0) vA.clear();        if (vB.size() > 0) vB.clear();        if (vC.size() > 0) vC.clear();                num2vector(a, vA);        sort(vA.begin(), vA.end());        vit = std::unique(vA.begin(), vA.end());        if (vit != vA.end())            continue;        b = a * a;        num2vector(b, vB);        sort(vB.begin(), vB.end());        vit = unique(vB.begin(), vB.end());        vB.erase(vit, vB.end());        std::set_intersection(vA.begin(), vA.end(), vB.begin(), vB.end(),                              std::inserter(vC, vC.begin()));        if (vC.size() == 0)        {            std::cout<<a<<" * "<<a<<" = "<<b<<std::endl;        }    }    return 0;}

结果: 639172 * 639172 = 408540845584

原创粉丝点击