题目:
目录
本题要求实现一个打印非负整数阶乘的函数。
函数接口定义:
void Print_Factorial ( const int N );
其中N
是用户传入的参数,其值不超过1000。如果N
是非负整数,则该函数必须在一行中打印出N
!的值,否则打印“Invalid input”。
裁判测试程序样例:
#include <stdio.h>
void Print_Factorial ( const int N );
int main()
{
int N;
scanf("%d", &N);
Print_Factorial(N);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
15
结尾无空行
输出样例:
1307674368000
结尾无空行
分析:
求阶乘,但是有很多位(N最大1000时乘出来有两千五百多位),自己弄个数组才行
答案:
void Print_Factorial(const int N) {
if (N < 0) {
printf("Invalid input");
}
else {
//自己定义一个数组存多位数字
#define a 10000
int number[a] = { 1 };
for(int i=1;i<a;i++){
number[i] = -1;
}
//开始阶乘
for (int i = 0; i < N; i++) {
for (int i1 = 0; i1 < a; i1++) {
if (number[i1] == -1) {
break;
}
else
{
number[i1] *= i + 1;
}
}
//每乘一次判断是否需要进位
for (int i1 = 0; i1 < a; i1++) {
if (number[i1] == -1) {
break;
}
else if (number[i1] >= 10) {
if (number[i1 + 1] == -1) {
number[i1 + 1] = number[i1] / 10;
}
else {
number[i1 + 1] += number[i1] / 10;
}
number[i1] %= 10;
}
}
}
//乘完了
//先看看有多少位
int i;
for (i=0; i < a; i++) {
if (number[i] == -1) {
break;
}
}
//再输出
for (; i > 0; i--) {
printf("%d", number[i-1]);
}
}
}
整个程序的代码:
#include <stdio.h>
void Print_Factorial ( const int N );
int main()
{
int N;
scanf("%d", &N);
Print_Factorial(N);
return 0;
}
void Print_Factorial(const int N) {
if (N < 0) {
printf("Invalid input");
}
else {
//自己定义一个数组存多位数字
//N最大1000时结果有2568位数字真的
#define a 10000
int number[a] = { 1 };
for(int i=1;i<a;i++){
number[i] = -1;
}
//开始阶乘
for (int i = 0; i < N; i++) {
for (int i1 = 0; i1 < a; i1++) {
if (number[i1] == -1) {
break;
}
else
{
number[i1] *= i + 1;
}
}
//每乘一次判断是否需要进位
for (int i1 = 0; i1 < a; i1++) {
if (number[i1] == -1) {
break;
}
else if (number[i1] >= 10) {
if (number[i1 + 1] == -1) {
number[i1 + 1] = number[i1] / 10;
}
else {
number[i1 + 1] += number[i1] / 10;
}
number[i1] %= 10;
}
}
}
//乘完了
//先看看有多少位
int i;
for (i=0; i < a; i++) {
if (number[i] == -1) {
break;
}
}
//再输出
for (; i > 0; i--) {
printf("%d", number[i-1]);
}
}
}