课本例题不会的地方 求解答

Q1:
题目是利用while循环编写程序计算100!的值并输出结果
课本答案是这样的

img

我疑惑为什么不能这么写,输出结果也是错误的

img

Q2:如图

img

图中 getchar()作用应该是删除字符吧?但为什么这里要删除字符?不删除会怎样?
感谢!!

100! = 9.3326215443944152681699238856267e+157
int和long long存不了这么大的数据。

这地方getchar用户清掉回车符缓存不然下面读取到的是前面输入的回车符

从标准输入流只读取一个字符(包括空格、回车、tab),读到回车符(’\n’)时退出,键盘输入的字符都存到缓冲区内,一旦键入回车,getchar就进入缓冲区读取字符,一次只返回第一个字符作为getchar函数的值,如果有循环或足够多的getchar语句,就会依次读出缓冲区内的所有字符直到’\n’.要理解这一点,之所以你输入的一系列字符被依次读出来,是因为循环的作用使得反复利用getchar在缓冲区里读取字符,而不是getchar可以读取多个字符,事实上getchar每次只能读取一个字符.如果需要取消’\n’的影响,可以用getchar()来清除,如:while((c=getchar())!=’\n’),这里getchar();只是取得了’\n’但是并没有赋给任何字符变量,所以不会有影响,相当于清除了这个字符。

Q1:
计算机里面int是有数值范围的,-2^31到2^31,也就是-2,147,483,648到2,147,483,648,明显不够100!的大小,%e是以科学计数法输出,也就是a*10的多少次方。
Q2:
getchar()消除回车,回车也是字符。

新的问题又出现了
Q2里
如果输出c的话不还是会输出
“出了n个红包,金额n"这句话吗,因为前面并没有编程处理c的东西呀