EularProject 32: 数字1-9排列构成乘法等式

Pandigital products

Problem 32

We shall say that an n-digit number is pandigital if it makes use of all the digits 1 to n exactly once; for example, the 5-digit number, 15234, is 1 through 5 pandigital.

The product 7254 is unusual, as the identity, 39 × 186 = 7254, containing multiplicand, multiplier, and product is 1 through 9 pandigital.

Find the sum of all products whose multiplicand/multiplier/product identity can be written as a 1 through 9 pandigital.

HINT: Some products can be obtained in more than one way so be sure to only include it once in your sum.

Answer:

45228

Completed on Sat, 25 Jul 2015, 15:13

python code:

from math import sqrt
def func(x):
    s0=set(str(x))
    for i in range(2,min(100,int(sqrt(x)+1))):
        if x%i==0:
            s1=set(str(i))
            s2=set(str(x//i))
            s=s0|s1|s2
            if len(s)==9 and ‘0‘ not in s:
                return True
    return False

result=0
for i in range(1000,9999):
    Pstr=str(i)
    if len(set(Pstr))==4 and ‘0‘ not in Pstr:
        if func(i):
            result+=i
            print(i)

print(result)

这里因为要求乘积不能重复,可以考虑对乘积候选项循环判断,把满足条件的加起来,并且很容易反证证明乘积项数字位数只能为4。

数字1-9是一个有趣的问题,更多问题可以参考

http://www.worldofnumbers.com/ninedig1.htm

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-23 14:04:28

EularProject 32: 数字1-9排列构成乘法等式的相关文章

中兴笔试 数字的最小排列

题目:根据给定的"锁定密码"(一串数字),可以计算出"解锁秘钥",它是该数中数字的最小排列(数量上),且它不会从零开始. 输入:一串数字lockingKey,约束-100000<= lockingKey <= 100000 输出:返回一个表示解锁的整数 实例: 输入: lockingKey = 706; 输出: 607 函数形式 long findUnlock(long lock) { }   参考程序: 1 #include <iostream&

[HAOI2015] 数字串拆分 - dp,矩阵乘法

有一个长度为 \(n\) 的数字串,定义 \(f(S)\) 为将 \(S\) 拆分为若干个 \([1,m]\) 的数的和的方案数.现在,你可以将这个数字串分割为若干个数字(允许前导 \(0\))并相加,求所有方案的 \(f\) 的和. \(n \leq 500, m \leq 5\) Solution 设 \(f[i]\) 为 \(i\) 的拆分数,那么显然有 \(f[i]=\sum_{j=1}^m f[i-j]\) 显然这个玩意可以用矩阵来转移,构造向量 \(v_i=(f[i],f[i-1],

n个数字的不同排列有n!个,要求将这些排列组成的数,按从小到大的顺序进行排列

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace One_two { /*   * 2.编写一个控制台应用程序,要求完成下列功能. * 接收一个整数n. * 如果接收的值n为正数,输出1到n间的全部整数. * 如果接收的值为0或负值,用break或者return退出程序. * 转到第一步继续接收下

1.32 (更高层次的抽象! 乘法与加法本来就是一回事)

(define (accumulate combiner null-value term a next b) (define (iter a result) (if (> a b) result (iter (next a) (combiner (term a) result)))) (iter a null-value)) (define (sum term a next b) (accumulate + 0 term a next b)) (define (product term a ne

大数加法和乘法

计算两个小的整形数相加的,用自带的+运算符就可以很容易的解决,但是对于两个很大的数来讲是会溢出的.用+运算符就无法完成了,当然你可以重载+运算符. 其实对于两个大整数相加,就是用到我们小学时学加法的方法-------竖式加法,一位一位的去相加,相加的和大于9只要进一位就OK了. 代码如下: #include <string.h> #include <stdio.h> const int N=100; char s1[N],s2[N]; //保存输入的两个大整数 int bign1[

组合排列的实现方法

最近在做数据分析系统,里面涉及到组合排列的问题,查找了很多的资料,但是感觉很多资料都是比较零散的,达不到项目需求. 后来经过一段的时间的探索,终于实现了组合排列的功能.下面我就来简单说说吧. 需求描述:   要实现的功能就是字符或数字的组合排列.例如:ab 的所有组合为:ab,ba :  ab的所有不重复排列为:ab. 其实这也是彩票中常说的直选和组选.效果图如下: 功能实现 这里就不多说了,直接贴上实现代码吧. 1.窗体界面设计 设计代码: 1 partial class FrmDemo 2

随机数字统计

要求: 随机生成50个数字(整数),每个数字的范围是[10, 50],统计每个数字出现的次数以及出现次数最多的数字与它的个数,最后将每个数字及其出现次数打印出 来,如果某个数字出现次数为0,则不要打印它.打印时按照数字的升序排列. 版本一:(使用数组实现) import java.util.Random; public class HomeWork { public static void main(String[] args) { int[] count = new int[50];//统计每

【算法练习题】力扣练习题——数组(4):下一个排列

原题说明:实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. 以下是一些例子,输入位于左侧列,其相应输出位于右侧列.1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1 原题链接:https://leetcode-cn.com/problems/next-permutation 题意分析: 先给出几个实例 1)123 → 1

面试题38_数字在排序数组中出现的次数

题目描写叙述 统计一个数字在排序数组中出现的次数. 解题思路 数组是排序的,所以反复出现的数字是相邻排列的. 用二分查找算法,找到第一次出现的位置.和 最后一次出现的位置. 推断第一次出现的位置条件为:当前数字的前一个是否与之相等.若是则继续查找,否则该位置就是第一次出现的位置. 推断最后一次出现的位置条件为:当前数字的后一个是否与之相等,若是则继续查找,否则该位置就是最后一次出现的位置. 出现的次数= last - first +1 时间复杂度:O(logn) 实现代码 class Solut