论程序算法与数学之美
----------------------学习编程,最痛苦的莫过于开始的“原始资本”积累阶段。董老师说这段时间,必须每日五百行代码入账。
下面的都是练习题,不过本屌在其中体会到了一股浓厚的数学之美,真的,如果学数学的来搞编程,可能很多人要下岗了。
一、计算练习
1.计算累加
1+2+3+4+...+99
看到题目,立马笑了,因为想到了高斯公式:n*(n+1)/2
public int add(int n)
{
return n*(n+1)/2;
}
但是,老师是要求我们循环的嘛!
public int add(int n)
{
int result = 0;
for(int i =1;i<=n;i++)
{
result = result+i;
}
return result;
}
1+3+5+7+...+99
由于上面是高斯公式,所以又在想怎么用公式算出来,不过没想起来,结果自己算了一下:((n+1)/2)^2
public int add(int n )
{
return (n+1)*(n+1)/4;
}
结果出来还合适,但是不适合推广。
经过上网查询,终于又找回了以前学过的等差数列的前n项和公式:n*(a1+an)/2或n*a1+n*(n-1)*d/2
public int add(int a1,int an,int n)
{
return n*(a1+an)/2;
}
如果这样写,你发现n这个值不好算,那算了,还是要循环吧。
public int f(int n)
{
int result=0;
for(int i = 1;i<=n;)
{
result = result+i;
i=i+2;
}
return result;
}
2.计算阶乘
1!+2!+3!+4!+...+10!
暂时最优的算法:
public int f(int n)
{
int result =0;
int last =1;
for(int i=1;i<=n;i++)
{
result = result+i*last;
last = i*last;
}
return result;
}
递归方法():
改良版:
public int f(int i)
{
if(i==1)
return 1;
else
return i*f(i-1);
}
public int jc(int n)
{
int result = 0;
for(int i=1;i<=n;i++)
{
result = result+f(i);
}
return result;
}
本屌的代码
public int f(int n)
{
int sum =1;
for(;n>0;n--)
{
sum = sum*n;
}
return sum;
}
public int jc(int n )
{
int result =0;
for(;n>0;n--)
{
result=result+f(n);
}
return result;
}
二、输出练习
1.利用for循环打印出9*9乘法表
更细的要求是输出三种乘法表:正方形、三角形、倒三角形
昨晚在CentO鼓搞了一下,终于出了效果。
效果挺美的,哈哈。代码如何:
倒三角形:
for(int i=1;i<=9;i++)
{
for(int j=1;j<=(i-1)*8;j++)
{
System.out.print(" ");
}
for(int k=i;k<=9;k++)
{
System.out.print(i+"x"+k+"="+i*k+"\t");
}
System.out.println("");
}
三角形:
for(int i=1;i<=9;i++)
{
for(int j =1;j<=i;j++)
{
System.out.print(i+"x"+j+"="+i*j+"\t");
}
System.out.println("");
}
矩形:
for(int i = 1;i<=9;i++)
{
for(int j =1;j<=9;j++)
{
System.out.print(i+"x"+j+"="+i*j+"\t");
}
System.out.println("");
}
2.输出水仙花数
要求:指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。(例如:1^3 + 5^3 + 3^3 = 153)
只做了100-999的
int a,b,c;
for(int i =100;i<=999;i++)
{
a = i/100;
b = i%100/10;
c = i%100%10;
if((a*a*a+b*b*b+c*c*c)==i)
System.out.println("the NumberOfDaffodils is:"+i);
}
有兴趣可以一直做下去,参考百科——水仙花数。
3.找质数:
明显,这是个数学问题,数学家去哪了?
留个空白。
四、总结
很多编程的问题,都是很美,尤其是算法什么,极具数学之简练,优美。编程的代码也可以像写诗一样,有押韵有结构,一目了然,阅读朗朗上口。