我与C++的二三事

Posted by 橙叶 on Sun, Dec 31, 2017

1.阶乘?阶乘的和?

题目:计算n个数的阶乘之和。
OK,那么,阶乘是什么东西????

阶乘即n!=1234567*………*n,很像数列的前n项和变成了前n项乘积。

那我直接按算前n项和的方法算阶乘就行咯:

  1. #include <iostream>
  2. using namespace std;
  3. int main(){
  4.     int n,s=1;
  5.     cin >> n;
  6.     for (int i=1;i<=n;i++)
  7.         s*=i!;
  8.     return 0;
  9. }
然而……C++和我一样不知道i!是什么玩意。所以,我必须自己得出阶乘。

阶乘的算法其实很简单,按数列的思路就可以得到。就是分别得到出1~n,然后将他们循环相乘就可以了:

  1. #include<iostream>
  2. using namespace std;
  3. int main(){
  4.     int i,res=1;
  5.         cin >> n;
  6.     for (i=1;i<=n;i++)
  7.         res*=i;
  8.     return res;
  9. }
试了以下,果然可以,那么怎样把这两个for循环组合到一起呢?

我的第一个想法是,把它们分开,这样比较清晰。将第二个计算阶乘的for循环拉出来,单独写个函数,然后在计算和的时候调用就可以了。这确实是个相当好的方法,我也不喜欢俄罗斯套娃式的代码(其实是自己脑子转不过来),于是就有了下面的代码:

  1. #include<iostream>
  2. using namespace std;
  3. int fac(int j);
  4. int main(){
  5.     int i,n,sum;
  6.     cin >> n;
  7.     for (int i=1;i<=n;i++)
  8.         sum+=fac(i);
  9.     cout << sum;
  10. }
  11. int fac(int j){
  12.     int i,res=1;
  13.     for (i=1;i<=j;i++)
  14.         res*=i;
  15.     return res;
  16. }
用函数就是比较清晰。而书上的答案,并不是使用函数,而是两个for的嵌套,像下面这样:
  1. #include<iostream>
  2. using namespace std;
  3. int main(){
  4.     int j,n,i,sum;
  5.     cin >> n;
  6.     for(j=1;j<=n;++j){
  7.           int fac=1;
  8.           for(i=1;i<=j;++i){
  9.                 fac=fac*i;
  10.             }
  11.         sum = sum +fac;
  12.         }
  13.     cout << sum;
  14. return 0;
  15. }
反正我觉得,书上的答案没我的办法好,我的多么简洁大气!我甚至还想了好长时间为什么答案上的变量fac要在第一个for里定义而不是在外面,若是放到函数里,这是自然而然根本无需细想的事。

2.我有特殊的判断方法

题目:检查一个正整数能否被3,5,7整除。
这简直是最基础的用来练习if语句的题目了,而且很显然是想让我用模运算符%来判断。

然而我第一个想到的并不是用模运算符,而是一种很久之前看到的好像叫循环差的东西,即:

100/3=33.33333333333…………

33.33333333…………*3=99.999999999…………

而在C++里,如果定义为整型,那么就会得到99,而99<100。

其实从数学上来说,99.9999999…………就等于100,这个不再多说。

于是就有了这样的代码:

  1. #include<iostream>
  2. using namespace std;
  3. int main(){
  4.     int n;
  5.     cin >> n;
  6.     if ((n/3)*3==n) cout << "3";
  7.     if ((n/5)*5==n) cout << "5";
  8.     if ((n/7)*7==n) cout << "7";
  9.     return 0;
  10. }
事实证明,它完全能满足需要,但是这样显然有些投机取巧了……,正确的方法应该是下面这样:
  1. #include<iostream>
  2. using namespace std;
  3. int main(){
  4.     int n;
  5.     cin >> n;
  6.     if (n%3==0) cout << "3";
  7.     if (n%5==0) cout << "5";
  8.     if (n%7==0) cout << "7";
  9.     return 0;
  10. }
嗯~

comments powered by Disqus