解题思路:输入最大即使是1000也到不了3000位数,所以声明3000长度的数组是完全足够的;特殊情况如果输入0的阶乘,也要返回0。


注意事项:如果只有一个进位变量会出现一些问题:如果在计算nums[i]之前计算好进位,就不能在这一轮使用进位了,如果在计算nums[i]后计算进位,因为nums[i]的值发生改变,所以进位的值也被改变了。使用一个旧的进位和一个新的进位能很好的避免这个问题,在计算nums[i]之前用新的进位提前存储下一轮要使用的进位,用上一轮的旧进位来计算nums[i]。

参考代码:

import java.util.Scanner;

public class Main {

	public static int[] nums = new int[3000];

	public static void main(String[] args) {

		Scanner scanner = new Scanner(System.in);
		String inputs = scanner.next();
		if (Integer.parseInt(inputs) == 0) {
			System.out.println("0");
		}
		char[] input = inputs.toCharArray();

		for (int i = 0; i < input.length; i++) {
			nums[i] = input[input.length - 1 - i] - '0';
		}

		int oldJ = 0; // 旧的进位
		int newJ = 0; // 新的进位
		for (int i = Integer.parseInt(inputs) - 1; i > 1; i--) {
			for (int j = 0; j < nums.length; j++) {
				newJ = (oldJ + nums[j] * i) / 10;
				nums[j] = (oldJ + nums[j] * i) % 10;
				oldJ = newJ;
			}
		}
		boolean b = true; // 当遇见第一个非0的数的时候,关闭开关
		for (int i = nums.length - 1; i >= 0; i--) {
			if (nums[i] == 0 && b) {
				continue;
			}
			b = false;
			System.out.print(nums[i]);
		}
	}
}


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论