原题链接:蓝桥杯基础练习VIP-阶乘计算
解题思路:输入最大即使是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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复