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

本文介绍了一种通过编程方法寻找符合条件的六位正整数,这些数的特点是每位数字不重复,且其平方数的各位数字中不包含原数的任何一位数字。文章提供了具体的实现代码及一个符合条件的例子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

找出这样的数:
    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
# P8482 「HGOI-1」Number ## 题目背景 $\text{bh1234666}$ 正在学习乘法! ## 题目描述 $\text{bh1234666}$ 有一定数量的数字 $0 \sim 9$,现在他想让你寻找一种分配方案,将它们分成两个整数,使得他们的乘积 $p$ 最大。 由于 $\text{bh1234666}$ 喜欢太大的数,所以你只需要输出**两个非负整数**,使它们的乘积**等于**最大乘积 $p$,但是这两个整数 $0 \sim 9$ 的数量能等于给定的数量(任意一个数字数量相等即可,**考虑前导零**)。 $\text{bh1234666}$ 是很善良的,如果 $0 \sim 9$ 的数量等于给定的数量了,你依旧可以得到的一半的分。 ## 输入格式 第一行十个整数 $c_0,c_1,\cdots c_9$,分别表示 $0 \sim 9$ 的个数。 ## 输出格式 共两行每行一个非负整数,分别表示你给出的两个非负整数。 ## 输入输出样例 #1 ### 输入 #1 ``` 1 2 3 2 1 1 2 1 2 1 ``` ### 输出 #1 ``` 13949030 620572547 ``` ## 说明/提示 #### 样例解释 最大可能乘积为 $97643210 \times 88653221=13949030 \times 620572547=8656385075279410$。 若输出 $97643210 \times 88653221$ 则只能得到一半的分,因为 $0\sim 9$ 出现的次数给定的相同。 #### 数据范围及约定 本题采用**捆绑测试**,共有 $5$ 个 $\text{subtask}$,最终分数为所有 $\text{subtask}$ 分数之和。 $$ \def\arraystretch{1.5} \begin{array}{|c|c|c|}\hline \textbf{Task} & \textbf{Score} & \sum c_i\le \cr\hline 1 & 10 & 20 \cr\hline 2 & 20 & 100 \cr\hline 3 & 20 & 5000 \cr\hline 4 & 20 & 10^6 \cr\hline 5 & 30 & 10^7 \cr\hline \end{array} $$ 对于 $100\%$ 的数据,保证 $1 \le c_i$,$\sum c_i \le 10^7$。 #### 说明 本题有 $\text{spj}$,两数乘积正确得一半的分,数量给出的同且乘积正确得全部分数。故每一 $\text{subtask}$ 的得分为其中所有数据点得分的**最小值**。
07-09
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值