我与C++的二三事
Dec. 31, 2017
1.阶乘?阶乘的和?
题目:计算n个数的阶乘之和。
OK,那么,阶乘是什么东西????
阶乘即n!=1234567*………*n,很像数列的前n项和变成了前n项乘积。
那我直接按算前n项和的方法算阶乘就行咯:
- #include <iostream>
- using namespace std;
- int main(){
- int n,s=1;
- cin >> n;
- for (int i=1;i<=n;i++)
- s*=i!;
- return 0;
- }
然而……C++和我一样不知道i!是什么玩意。所以,我必须自己得出阶乘。
阶乘的算法其实很简单,按数列的思路就可以得到。就是分别得到出1~n,然后将他们循环相乘就可以了:
- #include<iostream>
- using namespace std;
- int main(){
- int i,res=1;
- cin >> n;
- for (i=1;i<=n;i++)
- res*=i;
- return res;
- }
试了以下,果然可以,那么怎样把这两个for循环组合到一起呢?
我的第一个想法是,把它们分开,这样比较清晰。将第二个计算阶乘的for循环拉出来,单独写个函数,然后在计算和的时候调用就可以了。这确实是个相当好的方法,我也不喜欢俄罗斯套娃式的代码(其实是自己脑子转不过来),于是就有了下面的代码:
- #include<iostream>
- using namespace std;
- int fac(int j);
- int main(){
- int i,n,sum;
- cin >> n;
- for (int i=1;i<=n;i++)
- sum+=fac(i);
- cout << sum;
- }
- int fac(int j){
- int i,res=1;
- for (i=1;i<=j;i++)
- res*=i;
- return res;
- }
用函数就是比较清晰。而书上的答案,并不是使用函数,而是两个for的嵌套,像下面这样:
- #include<iostream>
- using namespace std;
- int main(){
- int j,n,i,sum;
- cin >> n;
- for(j=1;j<=n;++j){
- int fac=1;
- for(i=1;i<=j;++i){
- fac=fac*i;
- }
- sum = sum +fac;
- }
- cout << sum;
- return 0;
- }
反正我觉得,书上的答案没我的办法好,我的多么简洁大气!我甚至还想了好长时间为什么答案上的变量fac要在第一个for里定义而不是在外面,若是放到函数里,这是自然而然根本无需细想的事。
2.我有特殊的判断方法
题目:检查一个正整数能否被3,5,7整除。
这简直是最基础的用来练习if语句的题目了,而且很显然是想让我用模运算符
%
来判断。
然而我第一个想到的并不是用模运算符,而是一种很久之前看到的好像叫循环差的东西,即:
100/3=33.33333333333…………
33.33333333…………*3=99.999999999…………
而在C++里,如果定义为整型,那么就会得到99,而99<100。
其实从数学上来说,99.9999999…………就等于100,这个不再多说。
于是就有了这样的代码:
- #include<iostream>
- using namespace std;
- int main(){
- int n;
- cin >> n;
- if ((n/3)*3==n) cout << "3";
- if ((n/5)*5==n) cout << "5";
- if ((n/7)*7==n) cout << "7";
- return 0;
- }
事实证明,它完全能满足需要,但是这样显然有些投机取巧了……,正确的方法应该是下面这样:
- #include<iostream>
- using namespace std;
- int main(){
- int n;
- cin >> n;
- if (n%3==0) cout << "3";
- if (n%5==0) cout << "5";
- if (n%7==0) cout << "7";
- return 0;
- }
嗯~