7-11问题是找到4个正数(带有两个十进制数,A.BC),使得它们的和等于它们的乘积,等于7.11。
a + b + c + d = a * b * c * d = 7.11
0 < a <= b <= c <= d编写最短的程序来计算所有不递减的四倍。不允许预先计算值。
发布于 2011-06-18 06:33:37
不幸的是,我没有得到低于100分。它只是强迫所有可能的元组和检查之后。尽管如此,它仍然在有限的时间内完成。
(1..m=711).map{|a|(a..m).map{|b|(b..m).map{|c|d=m-a-b-c;p [a/u=1e2,b/u,c/u,d/u]if d>=c&&a*b*c*d==m*1e6}}}格式化的版本如下所示:
(1..m=711).map{ |a|
(a..m).map{ |b|
(b..m).map{ |c|
d=m-a-b-c
p [a/u=1e2,b/u,c/u,d/u] if d>=c && a*b*c*d==m*1e6
}
}
}发布于 2011-06-17 18:36:49
(增加额外的换行符以提高可读性)
h=711
main=mapM(print.map((/100).realToFrac))
[[a,b,c,d]|a<-[1..h],b<-[a..h],c<-[b..h],let d=h-a-b-c,c<=d,a*b*c*d==h*10^6]这通过只处理两个十进制数的数字来满足要求。它使用整数算法计算解决方案(其中只有一个),并将其缩放为100。浮点算法太不可信了。
发布于 2011-06-17 21:34:01
祭品:
#include<stdio.h>
int main(void){int a,b,c,d;for(a=1;a<=711/4;++a)for(b=a;b<=711/4;++b)for(c=b;c<=711/4;++c){d=711-(a+b+c);if(d<c)break;if(a*b*c*d==711000000)printf("a=%.2f,b=%.2f,c=%.2f,d=%.2f\n",a/100.,b/100.,c/100.,d/100.);}}为了可读性而重新格式化:
#include <stdio.h>
int main()
{
int a, b, c, d;
for (a = 1; a <= 711 / 4; ++a)
for (b = a; b <= 711 / 4; ++b)
for (c = b; c <= 711 / 4; ++c)
{
d = 711 - (a + b + c);
if (d < c) break;
if (a * b * c * d == 711000000)
printf("a = %.2f, b = %.2f, c = %.2f, d = %.2f\n", a / 100., b / 100., c / 100., d / 100.);
}
}https://codegolf.stackexchange.com/questions/2884
复制相似问题