新手请教一个简单C++问题,谢谢

输入一个整数n,输出n的阶乘
输入描述:
一个整数n(1<=n<=20)

输出描述:
n的阶乘

输入例子:
3

输出例子:
6

#include
using namespace std;
int main()
{
int n;
cin>>n;
if(n>=1&&n<=20)
{
while(n-1>0)
{
n=n*n-1;
}
cout<<n<<endl;
}

}
请问这样写的错误在哪?
为何有很多人用long型
谢谢!


int main()
{
    long n,Sum = 1;
    cin>>n;
    if(n>=1&&n<=20)
    {
        for (int i = 1;i <= n;i ++)
        {
            Sum *= i;
        }
        cout<<Sum<<endl;
    }
}

数据太大int类型容易产生溢出

不同数据类型表达数据长度不同

因为long类型可以保存的数据范围更大防止溢出