[三星]编程求组合

除了美化之外,还可以来尝试挑战一下任务
头像
tangmumao_wefls
帖子: 2899
注册时间: 2011-02-11 14:09
系统: AnthonOS Next
来自: 在那不遥远的地方
联系:

Re: [三星]编程求组合

#16

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

你把代码贴上来,你估计是用的C99的语法所以有些问题。。。我虽然只能勉强去参加高中生的计算机比赛不过看下代码还是能行的

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

Re: [三星]编程求组合

#17

帖子 maxiaojun0 » 2013-11-05 0:44

tangmumao_wefls 写了:你把代码贴上来,你估计是用的C99的语法所以有些问题。。。我虽然只能勉强去参加高中生的计算机比赛不过看下代码还是能行的
我的代码在10楼啊,用g++编译运行没问题啊。

既然这是一个被C++编译器接受的程序,我觉得它就可以被称作C++程序对不?

有人说我的程序是C程序,不是C++程序。那我在12楼就展示了,这个程序是不被C编译器接受的,哪怕开启C99模式都不行,这说明它不是一个C程序。

虽然把我的程序改造成一个合法的C99程序可能很简单,包含头文件stdbool.h就可以。
头像
tangmumao_wefls
帖子: 2899
注册时间: 2011-02-11 14:09
系统: AnthonOS Next
来自: 在那不遥远的地方
联系:

Re: [三星]编程求组合

#18

帖子 tangmumao_wefls » 2013-11-05 12:20

maxiaojun0 写了:
tangmumao_wefls 写了:你把代码贴上来,你估计是用的C99的语法所以有些问题。。。我虽然只能勉强去参加高中生的计算机比赛不过看下代码还是能行的
我的代码在10楼啊,用g++编译运行没问题啊。

既然这是一个被C++编译器接受的程序,我觉得它就可以被称作C++程序对不?

有人说我的程序是C程序,不是C++程序。那我在12楼就展示了,这个程序是不被C编译器接受的,哪怕开启C99模式都不行,这说明它不是一个C程序。

虽然把我的程序改造成一个合法的C99程序可能很简单,包含头文件stdbool.h就可以。
懂了,你没有把stdbool.h加入#include项,然后你用了C99标准的语法,GCC默认不兼容

我把你的代码按照NOIP的标准修改了一下,我的测试环境通过(MinGW TDM-GCC 4.6.1 under Windows Server 2008 R2 amd64,Using GUIDE IDE for NOI/NOIP),输出默认写到dfs.out文件

[c]
#include <stdio.h>
#include <stdbool.h>

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

void dfs(int n)
{
int i;
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 (i = 0; i < 10; i++)
{
if (used)
{
continue;
}
used = true;
digit[n] = i;
dfs(n + 1);
used = false;
}
}

int main()
{
freopen("dfs.out","w",stdout); //Write the output into a file, the NOIP way
dfs(0);
return 0;
}
[/c]
:em06 :em06 水平有限,只能用NOIP的方法了
头像
tangmumao_wefls
帖子: 2899
注册时间: 2011-02-11 14:09
系统: AnthonOS Next
来自: 在那不遥远的地方
联系:

Re: [三星]编程求组合

#19

帖子 tangmumao_wefls » 2013-11-05 12:54

maxiaojun0 写了:
tangmumao_wefls 写了:你把代码贴上来,你估计是用的C99的语法所以有些问题。。。我虽然只能勉强去参加高中生的计算机比赛不过看下代码还是能行的
我的代码在10楼啊,用g++编译运行没问题啊。

既然这是一个被C++编译器接受的程序,我觉得它就可以被称作C++程序对不?

有人说我的程序是C程序,不是C++程序。那我在12楼就展示了,这个程序是不被C编译器接受的,哪怕开启C99模式都不行,这说明它不是一个C程序。

虽然把我的程序改造成一个合法的C99程序可能很简单,包含头文件stdbool.h就可以。
其实严格按照NOIP的标准,我上一段程序是非法的,因为stdbool.h貌似不可用,那么这么写就好了
[c]
#include <stdio.h>

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

void dfs(int n)
{
int i;
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 (i = 0; i < 10; i++)
{
if (used)
{
continue;
}
used = 1;
digit[n] = i;
dfs(n + 1);
used = 0;
}
}

int main()
{
freopen("dfs.out","w",stdout); //Write the output into a file, the NOIP way
dfs(0);
return 0;
}
[/c]
:em01
头像
tangmumao_wefls
帖子: 2899
注册时间: 2011-02-11 14:09
系统: AnthonOS Next
来自: 在那不遥远的地方
联系:

Re: [三星]编程求组合

#20

帖子 tangmumao_wefls » 2013-11-05 13:10

maxiaojun0 写了:
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 
[bash]
Windows PowerShell
版权所有 (C) 2009 Microsoft Corporation。保留所有权利。

PS C:\Users\Tom> cd D:\Files\Programs_C\dfs
PS D:\Files\Programs_C\dfs> & 'C:\Program Files (x86)\GUIDE\MinGW64\bin\gcc.exe'
-o dfs.exe --std=gnu99 .\dfs.c
.\dfs.c:3:1: error: unknown type name 'bool'
.\dfs.c: In function 'dfs':
.\dfs.c:22:17: error: 'true' undeclared (first use in this function)
.\dfs.c:22:17: note: each undeclared identifier is reported only once for each f
unction it appears in
.\dfs.c:25:17: error: 'false' undeclared (first use in this function)
PS D:\Files\Programs_C\dfs>
[/bash]

在第2行添加
[c]#include <stdbool.h>[/c]
之后问题解决

你这个的确是C,而且是使用C99标准编写的,而GCC默认使用的是ANSI C/ISO C (aka C89),有一些用法是不允许的,比如
[c]
for (int i = 0; i < 10; i++)
{
//more code goes here
}
[/c]
在ISO C中应该这样写
[c]
int i;
for ( i = 0; i < 10; i++)
{
//more code goes here
}
[/c]

你的代码应该被修改成这样
[c]
#include <stdio.h>
#include <stdbool.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) {
continue;
}
used = true;
digit[n] = i;
dfs(n + 1);
used = false;
}
}

int main()
{
dfs(0);
return 0;
}
[/c]
并且编译的时候要这样编译(Windows下MinGW TDM-GCC的用法,Linux下注意下输出的二进制的名字不需要exe扩展名就好)
[bash]
gcc -o dfs.exe --std=gnu99 dfs.c
[/bash]
或者
[bash]
gcc -o dfs.exe --std=c99 dfs.c
[/bash]

From Wikipedia:
在《C++语言的设计和演化》(1994)中,Bjarne Stroustrup描述了他在设计C++时,所使用的一些原则。知道这些原则有助于理解C++为何会是现在这个样子。以下总结了一些原则,详尽的内容可参阅《C++语言的设计和演化》:
C++设计成直接的和广泛的支持多种程序设计风格(过程化程序设计、数据抽象化、面向对象程序设计、泛型程序设计)。
C++设计成给程序设计者更多的选择,即使可能导致程序设计者选择错误。
C++设计成尽可能与C兼容,借此提供一个从C到C++的平滑过渡
C++避免平台限定或没有普遍用途的特性。
C++不使用会带来额外开销的特性。
C++设计成无需复杂的程序设计环境。

几乎所有的C程序都可以被C++编译器当作C++编译,我以前经常用Visual Studio 2010的CLR来编译解NOIP题的程序,无问题 :em01 :em01
头像
tangmumao_wefls
帖子: 2899
注册时间: 2011-02-11 14:09
系统: AnthonOS Next
来自: 在那不遥远的地方
联系:

Re: [三星]编程求组合

#21

帖子 tangmumao_wefls » 2013-11-05 13:20

C++的特色包括类、模板、封装等,如果不用这些的话,从定义上来说还是C程序,g++之所于接受这段程序是因为C++默认有bool类型而gcc默认不接受就是因为没有bool类型,从代码上来看你这还是C程序 :em01
maxiaojun0
帖子: 47
注册时间: 2013-11-02 21:09
系统: Ubuntu

Re: [三星]编程求组合

#22

帖子 maxiaojun0 » 2013-11-05 16:56

tangmumao_wefls 写了:C++的特色包括类、模板、封装等,如果不用这些的话,从定义上来说还是C程序,g++之所于接受这段程序是因为C++默认有bool类型而gcc默认不接受就是因为没有bool类型,从代码上来看你这还是C程序
请问哪个定义规定了XXX语言的程序一定要使用XXX的「特色」?谁又有资格规定什么是C++的「特色」?能直接用bool,直接在函数任意位置声明变量不需要考虑什么C99不C99是不是C++的特色?而且特别你用Win的来说,MSVC根本就不怎么支持C99特性,狭义的C语言根本就不能把很多C99特性包括进来。
头像
tangmumao_wefls
帖子: 2899
注册时间: 2011-02-11 14:09
系统: AnthonOS Next
来自: 在那不遥远的地方
联系:

Re: [三星]编程求组合

#23

帖子 tangmumao_wefls » 2013-11-05 23:05

maxiaojun0 写了:
tangmumao_wefls 写了:C++的特色包括类、模板、封装等,如果不用这些的话,从定义上来说还是C程序,g++之所于接受这段程序是因为C++默认有bool类型而gcc默认不接受就是因为没有bool类型,从代码上来看你这还是C程序
请问哪个定义规定了XXX语言的程序一定要使用XXX的「特色」?谁又有资格规定什么是C++的「特色」?能直接用bool,直接在函数任意位置声明变量不需要考虑什么C99不C99是不是C++的特色?而且特别你用Win的来说,MSVC根本就不怎么支持C99特性,狭义的C语言根本就不能把很多C99特性包括进来。
当然这都是我的个人观点,仅供参考

我毕竟只是高中生,学习C也只是应学校要求参加NOIP而已,见识不多,还望多指教

下面还是我的个人观点:

在我买的PHP & MySQL: The Missing Manual(O'Reliiy Media出版,http://www.amazon.com/PHP-MySQL-The-Mis ... 1449325572)上作者提到,所有编程语言的程序员之间都有一些约定俗成的习惯,比如PHP偏好使用下划线来区分单词(比如使用$visit_record作为变量名而不是$VisitRecord,尽管两者在语法上都合法),那么从之前的来看,大家(包括我)认为你的代码是C而不是C++也是因为这种习惯,因为C++程序员更习惯于使用C++的特色而非传统的C;

关于C语言,我个人认为我们现在使用的根本不能算是纯净的C语言,纯净的C语言应该是The C Programming Language: 1st Edition里面所描述的K&R C,而后来的包括ISO C, C99, C11其实都或多或少融合了C++的特性,而且C++的向前兼容的特性也使得这两种语言的界限逐渐模糊,现在判断一段代码属于哪种语言个人认为更多的是靠习惯而不是理论,就像英语的语法是不讲道理的(习惯表达)一样。我也是凭习惯来作出结论的,而你这段代码严格说来混合使用了C++默认启用的特性和"习惯上的C编程风格",其实归为哪一类都对,不必太过认真;

另外关于编译器的问题,我个人其实平常用的最多的是Linux和运行于其中的GCC Clang和Intel C Compiler,这几天用Win是因为周末我的Debian Sid被我升级玩坏了,上学木有时间修;MSVC以前用不过也是对新标准支持较好的Microsoft Visual C++ Express 2010(编译器版本不清楚,只用过几次)和Microsoft Visual Studio 2012 Express for Windows Desktop(MSVC 11.0)而不是很老的MSVC 6.0,现在用的最多的是TDM-GCC(其实就是一个比原项目更新的MinGW)配合GUIDE/CodeBlocks IDE(因为要和NOIP接轨,我周六就考了),而且我因为知识结构的原因基本上只学过ISO C,关于C99和C11也只是有所耳闻;

以上纯属个人见解,欢迎批评,本人学识实在有限(学C就为了NOIP吗)

:em06 :em06 :em06
maxiaojun0
帖子: 47
注册时间: 2013-11-02 21:09
系统: Ubuntu

Re: [三星]编程求组合

#24

帖子 maxiaojun0 » 2013-11-06 11:26

tangmumao_wefls 写了:在我买的PHP & MySQL: The Missing Manual(O'Reliiy Media出版,http://www.amazon.com/PHP-MySQL-The-Mis ... 1449325572)上作者提到,所有编程语言的程序员之间都有一些约定俗成的习惯,比如PHP偏好使用下划线来区分单词(比如使用$visit_record作为变量名而不是$VisitRecord,尽管两者在语法上都合法),那么从之前的来看,大家(包括我)认为你的代码是C而不是C++也是因为这种习惯,因为C++程序员更习惯于使用C++的特色而非传统的C;
我的程序用了$VisitRecord能從PHP程序變成Java程序嗎?
tangmumao_wefls 写了: 关于C语言,我个人认为我们现在使用的根本不能算是纯净的C语言,纯净的C语言应该是The C Programming Language: 1st Edition里面所描述的K&R C,而后来的包括ISO C, C99, C11其实都或多或少融合了C++的特性,而且C++的向前兼容的特性也使得这两种语言的界限逐渐模糊,现在判断一段代码属于哪种语言个人认为更多的是靠习惯而不是理论,就像英语的语法是不讲道理的(习惯表达)一样。我也是凭习惯来作出结论的,而你这段代码严格说来混合使用了C++默认启用的特性和"习惯上的C编程风格",其实归为哪一类都对,不必太过认真;
ANSI C(應該你說的ISO C)1989年了就有了,C++第一次完成標準化是在1998(C++98)年,你覺得是C在融合C++的特性嗎?雖然C99、C11有吸收一些C++98的元素,但是也引入了C++中不存在的元素啊。
头像
tangmumao_wefls
帖子: 2899
注册时间: 2011-02-11 14:09
系统: AnthonOS Next
来自: 在那不遥远的地方
联系:

Re: [三星]编程求组合

#25

帖子 tangmumao_wefls » 2013-11-06 12:07

maxiaojun0 写了:
tangmumao_wefls 写了:在我买的PHP & MySQL: The Missing Manual(O'Reliiy Media出版,http://www.amazon.com/PHP-MySQL-The-Mis ... 1449325572)上作者提到,所有编程语言的程序员之间都有一些约定俗成的习惯,比如PHP偏好使用下划线来区分单词(比如使用$visit_record作为变量名而不是$VisitRecord,尽管两者在语法上都合法),那么从之前的来看,大家(包括我)认为你的代码是C而不是C++也是因为这种习惯,因为C++程序员更习惯于使用C++的特色而非传统的C;
我的程序用了$VisitRecord能從PHP程序變成Java程序嗎?
tangmumao_wefls 写了: 关于C语言,我个人认为我们现在使用的根本不能算是纯净的C语言,纯净的C语言应该是The C Programming Language: 1st Edition里面所描述的K&R C,而后来的包括ISO C, C99, C11其实都或多或少融合了C++的特性,而且C++的向前兼容的特性也使得这两种语言的界限逐渐模糊,现在判断一段代码属于哪种语言个人认为更多的是靠习惯而不是理论,就像英语的语法是不讲道理的(习惯表达)一样。我也是凭习惯来作出结论的,而你这段代码严格说来混合使用了C++默认启用的特性和"习惯上的C编程风格",其实归为哪一类都对,不必太过认真;
ANSI C(應該你說的ISO C)1989年了就有了,C++第一次完成標準化是在1998(C++98)年,你覺得是C在融合C++的特性嗎?雖然C99、C11有吸收一些C++98的元素,但是也引入了C++中不存在的元素啊。
关于“编程风格”的原文在这里(下划线的那个在更后面,我就没截图了)
图片
我想作者的意思是:
虽然代码只要工作了,那么代码就是正确的,这虽然没错;但是就像英语初学者说的英语(词完全正确但是表达不符合习惯,无法熟练使用习语etc)一样,虽然代码写得不错,但是熟练的程序员会认为代码写得很奇怪,要花时间去理解

而要写好代码不但是要写出正确的代码,也要写出符合习惯,显示你了解了这门语言的代码,有时候,这种代码可以被称为雄辩的(eloquent),使其看起来更自然
我引用并不代表我认可这个观点,只是对11楼将你的代码认为是C代码提出一种可能的解释,其实我自己写代码的时候从来没有“遵守习惯”,只要自己看的舒服,能工作就可以了,真正写代码的时候根本不用为习惯纠结,对吧 :em01

我只是说“某种程度”,其实现在两种语言的关系很复杂,我也没太多研究,我只是为了NOIP学了一点ISO C,很多都是个人感觉,也许我的不一定准确,不过我写代码只要能编译通过拿分就够了,真的不用太过纠结 :em01

你的代码从这个层面上,不管是被划归为C还是C++都有道理,完全是个人喜好和所谓的“The C++ Way”或者“The C Way”,也就是“习惯用法”在作怪,根本不用真正在意,我一开始以为你们在纠结为什么gcc不认,发的帖子可能有些奇怪,见笑了 :em01 不过现在看来这些代码是哪种语言都不为过,也不需要去死抠定义,只要代码能工作,就够了 :em01

我如果说错了,欢迎批评指正,本人只是高中生,见识实在有限 :em01
头像
tangmumao_wefls
帖子: 2899
注册时间: 2011-02-11 14:09
系统: AnthonOS Next
来自: 在那不遥远的地方
联系:

Re: [三星]编程求组合

#26

帖子 tangmumao_wefls » 2013-11-06 12:35

这道题我好像见过,是某年的NOIP的题?
好d的htt
帖子: 3
注册时间: 2012-06-04 18:08

Re: [三星]编程求组合

#27

帖子 好d的htt » 2013-11-17 22:50

tangmumao_wefls 写了:
maxiaojun0 写了:
tangmumao_wefls 写了:C++的特色包括类、模板、封装等,如果不用这些的话,从定义上来说还是C程序,g++之所于接受这段程序是因为C++默认有bool类型而gcc默认不接受就是因为没有bool类型,从代码上来看你这还是C程序
请问哪个定义规定了XXX语言的程序一定要使用XXX的「特色」?谁又有资格规定什么是C++的「特色」?能直接用bool,直接在函数任意位置声明变量不需要考虑什么C99不C99是不是C++的特色?而且特别你用Win的来说,MSVC根本就不怎么支持C99特性,狭义的C语言根本就不能把很多C99特性包括进来。
当然这都是我的个人观点,仅供参考

我毕竟只是高中生,学习C也只是应学校要求参加NOIP而已,见识不多,还望多指教

下面还是我的个人观点:

在我买的PHP & MySQL: The Missing Manual(O'Reliiy Media出版,http://www.amazon.com/PHP-MySQL-The-Mis ... 1449325572)上作者提到,所有编程语言的程序员之间都有一些约定俗成的习惯,比如PHP偏好使用下划线来区分单词(比如使用$visit_record作为变量名而不是$VisitRecord,尽管两者在语法上都合法),那么从之前的来看,大家(包括我)认为你的代码是C而不是C++也是因为这种习惯,因为C++程序员更习惯于使用C++的特色而非传统的C;

关于C语言,我个人认为我们现在使用的根本不能算是纯净的C语言,纯净的C语言应该是The C Programming Language: 1st Edition里面所描述的K&R C,而后来的包括ISO C, C99, C11其实都或多或少融合了C++的特性,而且C++的向前兼容的特性也使得这两种语言的界限逐渐模糊,现在判断一段代码属于哪种语言个人认为更多的是靠习惯而不是理论,就像英语的语法是不讲道理的(习惯表达)一样。我也是凭习惯来作出结论的,而你这段代码严格说来混合使用了C++默认启用的特性和"习惯上的C编程风格",其实归为哪一类都对,不必太过认真;

另外关于编译器的问题,我个人其实平常用的最多的是Linux和运行于其中的GCC Clang和Intel C Compiler,这几天用Win是因为周末我的Debian Sid被我升级玩坏了,上学木有时间修;MSVC以前用不过也是对新标准支持较好的Microsoft Visual C++ Express 2010(编译器版本不清楚,只用过几次)和Microsoft Visual Studio 2012 Express for Windows Desktop(MSVC 11.0)而不是很老的MSVC 6.0,现在用的最多的是TDM-GCC(其实就是一个比原项目更新的MinGW)配合GUIDE/CodeBlocks IDE(因为要和NOIP接轨,我周六就考了),而且我因为知识结构的原因基本上只学过ISO C,关于C99和C11也只是有所耳闻;

以上纯属个人见解,欢迎批评,本人学识实在有限(学C就为了NOIP吗)

:em06 :em06 :em06
:em20 现在的高中生都这么牛,接触php了,我高中还只听过Pascal :em06 :em06
头像
suiang
帖子: 30
注册时间: 2013-04-28 1:30
系统: ubuntukylin13.10

Re: [三星]编程求组合

#28

帖子 suiang » 2013-11-18 12:24

mayli 写了:

代码: 全选

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程序

代码: 全选

python -c "import itertools;print[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)]"
第二行代码没输出 少个print :em04

(1, 2, 4, 6, 5, 9, 0, 7, 8, 3)

124+659 = 0783
这个不能算吧 :em06
goglejerry
帖子: 1
注册时间: 2013-11-26 15:57
系统: ubuntu

Re: [三星]编程求组合

#29

帖子 goglejerry » 2013-11-26 16:13

代码: 全选

def plusCnt = 1
def min = 0
def max = 9
def range = min..max

def mod = (max+1)%(plusCnt+2)
int resultLengthInt = (max+1)/(plusCnt+2)
def resultLengthMin = mod == 0 ? resultLengthInt : resultLengthInt + 1
def resultLengthMax = resultLengthInt + 1
def resultLengthRange = resultLengthMin..resultLengthMax

range.permutations().each { list ->

	resultLengthRange.each { resultLength ->
		def resultVal = 0
		(max-resultLength+1..max).each {
			resultVal += list[it] * (10**(max-it))
		}
		doFind(list[min..max-resultLength], [], plusCnt, resultVal)
	}
}


def doFind(def list, def varList, def plusCnt, def result) {

	def maxIdx = list.size() - 1
	if (plusCnt == 0) {
		def var = 0
		(0..maxIdx).each {
			var += list[it] * (10**(maxIdx-it))
		}
		def total = 0
		varList.each {
			total += it
		}
		if (total + var == result) {
			println varList + var + result
		}
		return
	}

	(0..maxIdx-plusCnt).each { idx ->
		def var = 0
		def tmpList = varList.clone()
		(0..idx).each {
			var += list[it] * (10**(idx-it))
		}
		tmpList.add(var)
		doFind(list[idx+1..maxIdx], tmpList, plusCnt-1, result)
	}
}
groovy Ver.

没看清题目,做了个穷举的版本,执行起来相当慢...
貌似Groovy的each loop 效率不是很高,慎用。
xmfbit
帖子: 2
注册时间: 2014-05-10 17:11
系统: Ubuntu 14.04

Re: [三星]编程求组合

#30

帖子 xmfbit » 2014-05-11 23:40

我也来贴一段:

代码: 全选


#include <stdio.h>
#include <string.h>

int lookup_table[10] =
{
		0,0,0,0,0,0,0,0,0,0
};

void change_lookup_table(int num)
{
	char buf[16];
	sprintf(buf, "%d", num);
	int len = strlen(buf);
	for(int i=0; i < len; i++)
		lookup_table[buf[i] - '0'] ++;
	return ;
}
bool is_valid( int one ,int another ,int sum )
{
	memset( lookup_table, 0, 10 * sizeof(int) );  //初始化
	change_lookup_table(one);
	change_lookup_table(another);
	change_lookup_table(sum);
	for(int i = 0; i < 10; i++)
		if(lookup_table[i] > 1)
			return false;
	return true;
}

int main()
{
	const int start = 102;
	const int end = 987;
	const int sumstart = 1023;
	const int sumend = 1987;

	for(int one = start; one < end; one++)
	{
		for(int sum = sumstart; sum < sumend; sum++)
		{
			int ano = sum - one;
			if(ano <1000 && ano > one)
			{
				if(is_valid(one, ano, sum))
					printf("%d + %d = %d \n", one, ano, sum);
			}
		}
	}
	return 0;
}

回复