PAT基础编程题目-6-10 阶乘计算升级版
PAT基础编程题目-6-10 阶乘计算升级版
题目详情
解答
C语言版
#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\n");
return;
}
int number[3000] = {
0 }; //初始化全为0
int product; // 乘积
int carry; //进位
int size = 1; //记录数组中的元素个数
int flag, i;
number[0] = 1; //第0位为1
for (int v = 2; v <= N; v++) {
// 计算阶乘
for (i = 0; i < size; i++) {
// 遍历数组
// ---核心算法:计算乘积和进位并存入数组 ---
carry = 0; //进位只加一次,用完后要归0
flag = 1; //循环标志,方便随时跳出循环
while (flag) {
product = number[i] * v + carry; // 每次计算乘积要加上前一次的进位
number[i] = product % 10;
if (product >= 10) {
//大于等于10要计算进位
carry = product / 10;
i++;
flag = 1;
}
else {
flag = 0;
}
}
}
size = i; //i就可以反映当前存了多少位数
}
// printf("size=%d\n", size);
for (i = size-1; i >=0 ; i--)
printf("%d", number[i]);
}
C++版
#include<iostream>
using namespace std;
void Print_Factorial(const int N);
int main()
{
int N;
cin >> N;
Print_Factorial(N);
return 0;
}
void Print_Factorial(const int N) {
if (N < 0) {
cout << "Invalid input\n";
return;
}
int number[3000] = {
0 }; //初始化全为0
int product; // 乘积
int carry; //进位
int size = 1; //记录数组中的元素个数
int flag, i;
number[0] = 1; //第0位置为1
for (int v = 2; v <= N; v++) {
// 计算阶乘
for (i = 0; i < size; i++) {
// 遍历数组
// ---核心算法:计算乘积和进位并存入数组 ---
carry = 0; //进位只加一次,用完后要归0
flag = 1; //循环标志,方便随时跳出循环
while (flag) {
product = number[i] * v + carry; // 每次计算乘积要加上前一次的进位
number[i] = product % 10;
if (product >= 10) {
//大于等于10要计算进位
carry = product / 10;
i++;
flag = 1;
}
else {
flag = 0;
}
}
}
size = i; //i就可以反映当前存了多少位数
}
cout << "size=" << size << endl;
for (i = size - 1; i >= 0; i--)
cout << number[i];
}
Java版
public class Main{
private static void Print_Factorial(final int N) {
if(N<0) {
System.out.println("Invalid input");
} else {
int [] number = new int[3000]; // 已默认初始化全为0
int product, carry; //乘积,进位
int i;
int size = 1; //记录数组中的元素个数
number[0] = 1; //第0位置为1
boolean flag = true;
for (int value = 2; value <= N; value++) {
// 计算阶乘
for (i = 0; i < size; i++) {
// 遍历数组
// ---核心算法:计算乘积和进位并存入数组 ---
carry = 0; //进位只加一次,用完后要归0
flag = true; //循环标志,方便随时跳出循环
while(flag) {
product = number[i]*value + carry; // 每次计算乘积要加上前一次的进位
number[i] = product%10;
if(product>=10) {
//大于等于10要计算进位
carry = product/10;
i++;
flag = true;
} else {
flag = false;
}
}
}
size = i; //i就可以反映当前存了多少位数
}
System.out.println("size="+size);
for (i = size-1; i >= 0; i--) {
System.out.print(number[i]);
}
}
}
public static void main(String[] args) {
int N = 0;
Scanner scanner = new Scanner(System.in);
if(scanner.hasNext()) {
N = scanner.nextInt();
}
scanner.close();
Print_Factorial(N);
}
}
创作不易,喜欢的话加个关注点个赞,谢谢谢谢谢谢!