PAT基础编程题目-6-10 阶乘计算升级版

PAT基础编程题目-6-10 阶乘计算升级版

题目详情

题目地址:https://pintia.cn/problem-sets/14/problems/742

解答

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);
	}

}

创作不易,喜欢的话加个关注点个赞,谢谢谢谢谢谢!

全部评论

相关推荐

02-01 19:48
门头沟学院 Java
神哥了不得:(非引流)直接暑期吧,没时间日常了,老鱼简历把水印去了,或者换个模板,简历字体大小都不太行,建议换2个高质量的项目,面试应该还会再多一些
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务