计算面积。


12

给出曲线p(x)= a 0 + a 1 * x + a 2 * x 2 + ...,y = 0线,x = 0线和x = C线之间的面积的最小代码

(即:

通缉区

对于x <C,您可以假设p(x)> = 0(如果代码适用于p(x)的负值,则为积分)。

输入值

C,a 0,a 1,...

输出量

实数-面积

范例1:

input: 2, 0, 1
output: 2.0

示例2:

input: 3.0, 0, 0.0, 2
output: 18

更新:

  • 还假定C> 0
  • 面积在曲线之间,y = 0,x = C 和x = 0
  • 输入可以是任何形式的列表;不一定用逗号分隔。
  • 输出可以是任何形式的实数(因此,“ 18”是有效输出,“ 18.0”也是如此)

1
由于几乎所有输入的答案都将是“无限的”,因此我认为您已经错了这个问题了。
彼得·泰勒,

应该以逗号分隔的字符串形式从标准输入中读取输入吗?还是我们可以编写一个以浮点数列表作为参数的函数?
sepp2k 2011年

您是说在x = 0,x = C,y = 0和曲线之间吗?
基思·兰德尔

2
@Peter:我不这么认为。他显示了一个逆图(其积分发散),但是他指定的函数是多项式。[0,C)上的定积分应该被很好地定义并且对于有限系数是有限的。
dmckee ---前主持人小猫,

1
@dmckee,我已经注意到了,但是我的意思是,他正在将-\ infty到C的多项式进行积分,并且对任何非平凡的多项式进行积分。现在已对问题进行了修正以解决此问题。
彼得·泰勒

Answers:


3

Mathematica:48个字符

Sum[#[[i+1]]#[[1]]^i/i,{i,Length@#-1}]&@Input[]

-1个字节:Length@#-> Tr[1^#]。另外,您可以省略@Input[]并执行功能。
JungHwan Min

5

Python- 71 63个字符:

a=input()
print sum(1.*a[i]*a[0]**i/i for i in range(1,len(a)))

这是0和之间的多项式函数的简单集成C。而且我还没有测试过,但是我很确定它适用于负值。


了解了一些有关input()今天的新知识:)
st0le 2011年

3

Haskell,85个字符

f(c:l)=sum.map(\(i,x)->x*c**i/i)$zip[1..]l
main=getLine>>=print.f.read.('[':).(++"]")

1
这个问题并不像您对待的那么严格。您绝对可以简化输入代码,并且可以完全取消显式I / O。
JB

3

J,26个字符

f=:3 :'((1}.y)&p.d._1)0{y'

例如

   f 2 0 1
2
   f 3 0 0 2
18

整齐!我找不到使它更加默认的方法。这d.是一个结合并不能使它很容易我的新手技能Ĵ。
JB

@JB:是的,d。对我来说也是一个“问题”。:)
Eelvex 2011年

2

Ruby,65个字符

i=s=0
c=gets(q=",").to_f
$<.each(q){|a|s+=a.to_f*c**(i+=1)/i}
p s

代码读取直到输入结束,而不是行的结尾。因此,您需要按Ctrl+ D终止输入。(使用echo或从文件输入管道。)


1
我认为分配“”给一个变量将帮助......这个怎么样c=gets(q=",").to_f$<.each(q){|a|s+=a.to_f*c**(i+=1)/i},节省了一个字符....
st0le

@ st0le:非常好。谢谢。
sepp2k 2011年

分配","(或?,什至更短)可以$/允许您省略的参数$<.each。并且$<.map比短一个字符$<.each。;)
Ventero 2011年

2

C GCC 186182字节

f(){i=0,l=1;float *d,s=0.0;d=malloc(sizeof(float)*50);scanf("%f",&d[0]);while(getchar()!='\n'){scanf("%f",&d[l]);l++;}for(i=0;i<l;i++)s+=d[i+1]*pow(d[0],(i+1))/(i+1);printf("%f",s);}

该程序为曲线y = 0,x = C和x = 0之间的任何曲线提供输出(面积)。它也可以采用float048的系数。接受的第一个输入C后跟系数。Ènter在最后一个系数之后按。

void f()
{
  int i=0,l=1;
  float *d,s=0.0;
  const int sz=100;
  d=malloc(sizeof(float)*sz);

  scanf("%f",&d[0]);
  while(getchar()!='\n')
  {
    scanf("%f",&d[l]);
    l++;
  }

  for(i=0;i<l;i++)
    s+=d[i+1]*pow(d[0],(i+1))/(i+1);

   printf("%f",s);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.