2007叶光津


私信TA

用户名:uq_70078723231

访问量:5792

签 名:

工资1800,每日笑哈哈

等  级
排  名 626
经  验 4115
参赛次数 1
文章发表 14
年  龄 0
在职情况 学生
学  校 湖北生物科技职业学院
专  业

  自我简介:

解题思路:输入最大即使是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分

1 人评分

  评论区

  • «
  • »