[三星]编程求组合

除了美化之外,还可以来尝试挑战一下任务
回复
头像
oneleaf
论坛管理员
帖子: 10441
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04

[三星]编程求组合

#1

帖子 oneleaf » 2013-09-29 10:39

1 任务内容: 从 0~9 十个数字中找出所有满足 口口口 + 口口口 = 口口口口 的组合。

2 任务的难度: 三星

3 任务的目的: 学习 Linux 下编程

4 任务所涉及的软件: 任何语言

5 任务将大致消耗的时间: 1-2天
mayli
帖子: 3
注册时间: 2008-06-06 9:16

Re: [三星]编程求组合

#2

帖子 mayli » 2013-09-29 11:04

代码: 全选

python -c "import itertools;print [l for l in itertools.permutations(range(10)) if (int(''.join(str (j) for j in l[:3]))+int(''.join(str (j) for j in l[3:6]))==int(''.join(str (j) for j in l[6:])))]"
real 0m37.055s

代码: 全选

python -c "import itertools;[l for l in itertools.permutations(range(10)) if ((l[0]+l[3]-l[7])*100+(l[1]+l[4]-l[8])*10+l[2]+l[5]-l[9]==l[6]*1000)]"
real 0m4.435s

代码: 全选

python -c "import itertools,pprint;pprint.pprint([l for l in itertools.permutations(range(10)) if ((l[0]+l[3]-l[7])*100+(l[1]+l[4]-l[8])*10+l[2]+l[5]-l[9]==l[6]*1000)])"
real 0m5.007s

成功的写成了3个benchmark程序
头像
oneleaf
论坛管理员
帖子: 10441
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04

Re: [三星]编程求组合

#3

帖子 oneleaf » 2013-09-29 11:48

:em02 抓到了个潜水艇,呵呵。有其它语言的实现没?
头像
月下叹逍遥
论坛版主
帖子: 33994
注册时间: 2010-10-07 14:23
系统: Archdows10
来自: 某系某星某洲某国某省某市
联系:

Re: [三星]编程求组合

#4

帖子 月下叹逍遥 » 2013-09-29 12:44

叶大这个是什么意思?
把一个四位数拆解成两个三位数的和?

Sent from my SK17i using Tapatalk 2
浮生七十今三十,从此凄惶未可知
头像
oneleaf
论坛管理员
帖子: 10441
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04

Re: [三星]编程求组合

#5

帖子 oneleaf » 2013-09-29 12:51

你运行下二楼的代码就知道了。
头像
月下叹逍遥
论坛版主
帖子: 33994
注册时间: 2010-10-07 14:23
系统: Archdows10
来自: 某系某星某洲某国某省某市
联系:

Re: [三星]编程求组合

#6

帖子 月下叹逍遥 » 2013-09-29 13:04

oneleaf 写了:你运行下二楼的代码就知道了。
回去试试,好久没碰码了。一行的py看着挺蛋疼的。

Sent from my SK17i using Tapatalk 2
浮生七十今三十,从此凄惶未可知
kkdr_fyb
帖子: 2
注册时间: 2013-09-29 1:16
系统: ubuntu13.04

Re: [三星]编程求组合

#7

帖子 kkdr_fyb » 2013-09-29 18:27

这个语言很强大啊,很简洁,就是我不懂啊,这个语言主要用在哪里啊? :em20
头像
月下叹逍遥
论坛版主
帖子: 33994
注册时间: 2010-10-07 14:23
系统: Archdows10
来自: 某系某星某洲某国某省某市
联系:

Re: [三星]编程求组合

#8

帖子 月下叹逍遥 » 2013-10-23 0:17

依旧没看懂题目,把输出拆解一下输出出来应该就可以了吧?

代码: 全选

for x in range(100,999):
    for y in range(100,999):
        z=x+y
        if z>999:
            print(x,"+",y,"=",z)
浮生七十今三十,从此凄惶未可知
头像
oneleaf
论坛管理员
帖子: 10441
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04

Re: [三星]编程求组合

#9

帖子 oneleaf » 2013-10-23 9:28

月下叹逍遥 写了:依旧没看懂题目,把输出拆解一下输出出来应该就可以了吧?

代码: 全选

for x in range(100,999):
    for y in range(100,999):
        z=x+y
        if z>999:
            print(x,"+",y,"=",z)
就是将0-9 十个数字填入到方框里面,使其满足等式: 口口口 + 口口口 = 口口口口
maxiaojun0
帖子: 47
注册时间: 2013-11-02 21:09
系统: Ubuntu

Re: [三星]编程求组合

#10

帖子 maxiaojun0 » 2013-11-02 23:20

C++版本

代码: 全选

#include <stdio.h>

bool used[10];
int digit[10];

void dfs(int n)
{
	if (n == 10) {
		int a = digit[0] * 100 + digit[1] * 10 + digit[2];
		int b = digit[3] * 100 + digit[4] * 10 + digit[5];
		int c = digit[6] * 1000 + digit[7] * 100 + digit[8] * 10 + digit[9];
		if (a + b == c) {
			printf("%03d + %03d = %04d\n", a, b, c);
		}
		return;
	}

	for (int i = 0; i < 10; i++) {
		if (used[i]) {
			continue;
		}
		used[i] = true;
		digit[n] = i;
		dfs(n + 1);
		used[i] = false;
	}
}

int main()
{
	dfs(0);
	return 0;
}
头像
cjxgm
帖子: 1952
注册时间: 2010-04-23 20:40
系统: Arch Linux
来自: 浙江·杭州
联系:

Re: [三星]编程求组合

#11

帖子 cjxgm » 2013-11-03 14:30

maxiaojun0 写了:C++版本

代码: 全选

#include <stdio.h>

bool used[10];
int digit[10];

void dfs(int n)
{
	if (n == 10) {
		int a = digit[0] * 100 + digit[1] * 10 + digit[2];
		int b = digit[3] * 100 + digit[4] * 10 + digit[5];
		int c = digit[6] * 1000 + digit[7] * 100 + digit[8] * 10 + digit[9];
		if (a + b == c) {
			printf("%03d + %03d = %04d\n", a, b, c);
		}
		return;
	}

	for (int i = 0; i < 10; i++) {
		if (used[i]) {
			continue;
		}
		used[i] = true;
		digit[n] = i;
		dfs(n + 1);
		used[i] = false;
	}
}

int main()
{
	dfs(0);
	return 0;
}
这不是C++,这是C
Clanjor Prods. | Develop for Developers. (C++, Lua) | 作曲编曲 | 实时渲染引擎
maxiaojun0
帖子: 47
注册时间: 2013-11-02 21:09
系统: Ubuntu

Re: [三星]编程求组合

#12

帖子 maxiaojun0 » 2013-11-03 21:01

cjxgm 写了:这不是C++,这是C

代码: 全选

$ gcc test.c 
test.c:3:1: 错误: 未知的类型名‘bool’
test.c: 在函数‘dfs’中:
test.c:18:4: 错误: 只允许在 C99 模式下使用‘for’循环初始化声明
test.c:18:4: 附注: 使用 -std=c99 或 -std=gnu99 来编译您的代码
test.c:22:17: 错误: ‘true’未声明(在此函数内第一次使用)
test.c:22:17: 附注: 每个未声明的标识符在其出现的函数内只报告一次
test.c:25:17: 错误: ‘false’未声明(在此函数内第一次使用)
$ gcc -std=c99 test.c 
test.c:3:1: 错误: 未知的类型名‘bool’
test.c: 在函数‘dfs’中:
test.c:22:17: 错误: ‘true’未声明(在此函数内第一次使用)
test.c:22:17: 附注: 每个未声明的标识符在其出现的函数内只报告一次
test.c:25:17: 错误: ‘false’未声明(在此函数内第一次使用)
$ gcc -std=gnu99 test.c 
test.c:3:1: 错误: 未知的类型名‘bool’
test.c: 在函数‘dfs’中:
test.c:22:17: 错误: ‘true’未声明(在此函数内第一次使用)
test.c:22:17: 附注: 每个未声明的标识符在其出现的函数内只报告一次
test.c:25:17: 错误: ‘false’未声明(在此函数内第一次使用)
$ g++ test.c 
头像
tangmumao_wefls
帖子: 2899
注册时间: 2011-02-11 14:09
系统: AnthonOS Next
来自: 在那不遥远的地方
联系:

Re: [三星]编程求组合

#13

帖子 tangmumao_wefls » 2013-11-03 23:15

c是没有bool的吧,至少我参加NOIP是没有的,直接用unsigned int

Sent from my MI 2 using Xparent Skyblue Tapatalk 2
maxiaojun0
帖子: 47
注册时间: 2013-11-02 21:09
系统: Ubuntu

Re: [三星]编程求组合

#14

帖子 maxiaojun0 » 2013-11-04 14:48

tangmumao_wefls 写了:c是没有bool的吧,至少我参加NOIP是没有的,直接用unsigned int
用stdbool.h就可以有~

http://pubs.opengroup.org/onlinepubs/00 ... ool.h.html
头像
tangmumao_wefls
帖子: 2899
注册时间: 2011-02-11 14:09
系统: AnthonOS Next
来自: 在那不遥远的地方
联系:

Re: [三星]编程求组合

#15

帖子 tangmumao_wefls » 2013-11-04 22:49

maxiaojun0 写了:
tangmumao_wefls 写了:c是没有bool的吧,至少我参加NOIP是没有的,直接用unsigned int
用stdbool.h就可以有~

http://pubs.opengroup.org/onlinepubs/00 ... ool.h.html
反正全国计算机奥林匹克联赛(NOIP)是不让用的

Sent from my MI 2 using Xparent Skyblue Tapatalk 2
回复