今天在一个IT网站看到一个小程序,题目是输入一整数,在小于这个整数的序列中能组成多少个互不相同且无重复数字的三位数?
看了一眼这个程序,我的第一反应就是用几个for循环就搞定了,然后看了文章里对这个程序的解法也是几个for循环。如下:
int count = 0;
for (int i = 1; i <= N; i++)
{
for (int j = 0; j <= N; j++)
{
for (int k = 0; k <= N; k++)
{
if (k != j && k != i && j != i)
{
++count;
}
}
}
}
一个小程序用了三个for循环,输入的数的大小直接决定着运行的时间,O(N^3),这样做未免太浪费时间了。
其实,这种题目,在高中的时候数学课上没少做,就是简单的排序组合,楼主居然第一反应没想到用数学方法来解,看来这么多年后,真的是有些东西就淡忘了,
如果用数学的排列组合方法来解只需要一行程序就搞定了。个数就是N*N*(N-1)
int count = 0;
count = N*N*(N-1);
虽然只是一个小程序,还是看出来很多时候编程的时候数学思想已经淡薄了,看到一道编程题目,第一反应都不是用数学思想去解决,这个大家要引以为戒啊!