文档章节

定义P(n)为正整数n的所有非0数字的乘积,计算P(1),P(2)...P(999)的和

hell0cat
 hell0cat
发布于 2016/07/11 23:25
字数 741
阅读 64
收藏 0

例如: P(3) = 3, P(123) = 123 = 6, P(204) = 2*4 = 8 计算:P(1)+P(2)+P(3)+...+P(999)

Rust:

fn digits_multiply(mut n: u64) -> u64 {
	match n {
		0 => 1,
		_ => {
			let mut m = 1;
			while n > 9 { //let b = n % 10; //m *= if b == 0 { 1 } else { b };
				m *= std::cmp::max(1, n % 10);
				n /= 10;
			}
			m * n
		},
	}
}

fn main() {
	let sum = (1..999+1).fold(0, |sum, i| sum + digits_multiply(i));
	println!("result = {}", sum);
}

Haskell

-- 求出整数的所有数字组成List 然后过滤,然后乘积
digitsMultiply n = product $ filter (>0) $ digits n
                where digits m = if m < 10 then [m] else m `mod` 10 : (digits $ m `div` 10)


-- 另外一种写法,直接用递归法,计算出一个整数的所有数字乘积 max 1 (n `mod` 10)排除0计算
digitsMultiply n = if n == 0
                        then 1 
                        else if n < 10 then n else (max 1 $ n `mod` 10) * digitsMultiply (n `div` 10)

-- 调用代码
main = do
    print $ sum $ map digitsMultiply [1..999]


-- 第三种写法,一句代码:
[Prelude] > sum . map ( product . filter (>0) .  map (\x ->  read [x] :: Int) . show ) $ [1..999] 
-- 97335

-- 左边为 curry 函数,右边 传入最终参数调用。
-- 第一步,先写出一个将数字转换成整数List的函数:
Prelude> map (\x ->  read [x] :: Int) . show $ 123
-- [1,2,3]
-- 函数为:
digits = map (\x ->  read [x] :: Int) . show  
-- 或者2:
digits :: Integer -> [Int]
digits = map (read . return) . show
-- 或者3:
digits :: Integer -> [Int]
digits = map (read . (:[])) . show   
-- 2、3两种写法需要声明函数原型,因为read需要声明转换类型。
-- 有了digits函数,就可以 在左边继续增加 filter 函数过滤掉0,然后是求乘积。
-- 增加map 求[1..999] 列表中每一项的数字乘积。
-- 最后一步增加sum求和即可。
-- List comprehension 写法:
Prelude > sum [ y | n <- [1..999], y <- [product . filter (>0) . map (\x -> read [x] :: Int) . show $ n] ]

Ruby

puts (1..999).map{|i| i.to_s.chars.map(&:to_i).select{|v| v>0}.inject(&:*) }.inject(&:+)
97335
 => nil 

或者用 reject(&:zero?) 来替换 select{|v| v>0} 更加简洁

2.2.2 :002 > (1..999).map{|i| i.to_s.chars.map(&:to_i).reject(&:zero?).inject(&:*) }.inject(&:+)
 => 97335 

结果是97335,ruby和haskell解决数学问题很清晰。

julia语言,专为计算而生,看起来不比lisp容易,虽然julia本身语法并不复杂,但因为原生没有链式调用,所以阅读起来是非常吃力的。

julia> sum(map(y->prod(filter(x->x!=0, digits(y))), 1:999))
97335

使用Lazy包:

julia> using Lazy
INFO: Precompiling module Lazy...

julia> @>> 1:999 map(x-> prod(filter(y->y!=0, digits(x)))) sum
97335

外部简化了一层,内部还是跟包裹一样难读。 使用 |> 语法

1:999 |> a -> map( b -> digits(b) |> c -> filter(d -> d > 0,  c) |> prod,  a) |> sum

稍微简化了一些,但因为缺少Scala的默认下划线变量,导致lambda函数不断需要申明变量,看起来也很杂乱,如果后续Julia可以提供 _ 变量占用符,那么会变得清晰很多: 下面这段不能运行。

1:999  |> map( digits(_) |> filter( _ > 0,  _) |> prod,  _) |> sum 

在julia语言彻底解决链式调用前,还不适合用来解决数学问题。

© 著作权归作者所有

共有 人打赏支持
hell0cat
粉丝 37
博文 48
码字总数 24082
作品 0
徐汇
程序员
私信 提问
每个程序员都应该知道的基础数论

这篇文章讨论了每个程序员应该理解的数字理论中几个最重要的概念。这里即不会讨论入门型教程,也不会讨论任何具体的算法。相反,这篇文章仅供参考。外部参考(主要来自维基百科和 Wolfram )...

oschina
2017/09/11
3.3K
6
343. Integer Break

问题 将一个正整数分成至少两个正整数的和,使得最大化这些整数的乘积,给出最大乘积。 Input: 10 Output: 36 Explanation: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36 思路 什么时候pq > p + q,只要...

PilgrimHui
2018/10/09
0
0
Java实现的RSA算法,含加密解密算法,不使用工具类jar

import java.util.Scanner; public class RsaUtil { private long p,q;//输入的两个素数p、q private long n;//两个素数p、q的乘积之和n private long phi;//n的欧拉函数值phi=(p-1)*(q-1......

一梦心草
2016/12/27
33
0
Python3 欧拉计划 问题36-40

问题31—35参见:https://www.jianshu.com/p/199a1762f3a0 36、二进制回文数 十进制数585 的二进制表示为 1001001001,可以看出它在这两种进制下都是回文数。找出所有小于一百万,且在十进制...

AiFan
2017/12/29
0
0
朴素贝叶斯案例1:进行文档/评论分类(python实现)

机器学习的一个重要应用就是文档的自动分类,比如一封电子邮件、新闻报道、用户留言、政府公文等。在文档分类中,比如一封电子邮件就是一个实例,而电子邮件中的某些元素(词语)则构成特征。...

pbgc396dwxjb77f2je
2017/12/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

5、redis分布式锁

参考链接:https://www.cnblogs.com/linjiqin/p/8003838.html 一:介绍 实现分布式锁有三种方式:1、数据库乐观锁,2、基于redis,3、基于zookeeper。 redis服务端是单线程操作,完美地避免了...

刘付kin
23分钟前
3
0
OSChina 周日乱弹 —— 我重新说

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享矢野立美的单曲《LOVE Theme from TIGA <M-2>》: 《LOVE Theme from TIGA <M-2>》- 矢野立美 手机党少年们想听歌,请使劲儿戳...

小小编辑
今天
64
5
Java单例模式学习记录

在项目开发中经常能遇见的设计模式就是单例模式了,而实现的方式最常见的有两种:饿汉和饱汉(懒汉)。由于日常接触较多而研究的不够深入,导致面试的时候被询问到后有点没底,这里记录一下学习...

JerryLin123
昨天
10
0
VSCODE 无法调试

VSCODE 无法调试 可以运行 可能的原因: GCC 的参数忘了加 -g

shzwork
昨天
5
0
理解去中心化 稳定币 DAI

随着摩根大通推出JPM Coin 稳定币,可以预见稳定币将成为区块链落地的一大助推器。 坦白来讲,对于一个程序员的我来讲(不懂一点专业经济和金融),理解DAI的机制,真的有一点复杂。耐心看完...

Tiny熊
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部