diff --git a/Jenkinsfile b/Jenkinsfile index 7efe63b..69a17cf 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -35,16 +35,16 @@ pipeline { echo '🚀 开始部署前端文件...' script { // 确保目标目录存在 - sh 'mkdir -p /app/www' + sh 'mkdir -p /app/suanfa/www' // 清空旧文件 - sh 'rm -rf /app/www/*' + sh 'rm -rf /app/suanfa/www/*' // 复制新构建的 dist 文件到挂载目录 - sh 'cp -r dist/* /app/www/' + sh 'cp -r dist/* /app/suanfa/www/' echo '✅ 前端文件部署到 Web 服务目录完成!' // 可选:列出部署的文件以便验证 - sh 'ls -la /app/www/ | head -10' + sh 'ls -la /app/suanfa/www/ | head -10' } } } diff --git a/src/__tests__/mathUtils.test.js b/src/__tests__/mathUtils.test.js new file mode 100644 index 0000000..ca12350 --- /dev/null +++ b/src/__tests__/mathUtils.test.js @@ -0,0 +1,102 @@ +import { describe, it, expect } from 'vitest' +import { factorial, isPrime, fibonacci, gcd, lcm } from '../utils/mathUtils.js' + +describe('factorial', () => { + it('should return 1 for 0!', () => { + expect(factorial(0)).toBe(1) + }) + + it('should return 1 for 1!', () => { + expect(factorial(1)).toBe(1) + }) + + it('should calculate 5! = 120', () => { + expect(factorial(5)).toBe(120) + }) + + it('should calculate 10! = 3628800', () => { + expect(factorial(10)).toBe(3628800) + }) + + it('should throw error for negative numbers', () => { + expect(() => factorial(-1)).toThrow('负数没有阶乘') + }) +}) + +describe('isPrime', () => { + it('should return false for numbers <= 1', () => { + expect(isPrime(0)).toBe(false) + expect(isPrime(1)).toBe(false) + }) + + it('should return true for 2', () => { + expect(isPrime(2)).toBe(true) + }) + + it('should return true for prime numbers', () => { + expect(isPrime(7)).toBe(true) + expect(isPrime(13)).toBe(true) + expect(isPrime(97)).toBe(true) + }) + + it('should return false for composite numbers', () => { + expect(isPrime(4)).toBe(false) + expect(isPrime(15)).toBe(false) + expect(isPrime(100)).toBe(false) + }) +}) + +describe('fibonacci', () => { + it('should return 0 for fib(0)', () => { + expect(fibonacci(0)).toBe(0) + }) + + it('should return 1 for fib(1)', () => { + expect(fibonacci(1)).toBe(1) + }) + + it('should calculate fib(10) = 55', () => { + expect(fibonacci(10)).toBe(55) + }) + + it('should calculate fib(20) = 6765', () => { + expect(fibonacci(20)).toBe(6765) + }) + + it('should throw error for negative input', () => { + expect(() => fibonacci(-5)).toThrow('下标不能为负数') + }) +}) + +describe('gcd', () => { + it('should return 6 for gcd(18, 24)', () => { + expect(gcd(18, 24)).toBe(6) + }) + + it('should return 1 for coprime numbers', () => { + expect(gcd(7, 13)).toBe(1) + }) + + it('should handle zero', () => { + expect(gcd(0, 5)).toBe(5) + expect(gcd(5, 0)).toBe(5) + }) + + it('should handle negative numbers', () => { + expect(gcd(-18, 24)).toBe(6) + }) +}) + +describe('lcm', () => { + it('should calculate lcm(4, 6) = 12', () => { + expect(lcm(4, 6)).toBe(12) + }) + + it('should calculate lcm(7, 13) = 91', () => { + expect(lcm(7, 13)).toBe(91) + }) + + it('should return 0 if either number is 0', () => { + expect(lcm(0, 5)).toBe(0) + }) +}) diff --git a/src/utils/mathUtils.js b/src/utils/mathUtils.js new file mode 100644 index 0000000..eaae4a0 --- /dev/null +++ b/src/utils/mathUtils.js @@ -0,0 +1,79 @@ +/** + * 基础数学工具函数 - 算法教学辅助 + */ + +/** + * 计算阶乘 (n!) + * @param {number} n - 非负整数 + * @returns {number} n 的阶乘 + */ +export function factorial(n) { + if (n < 0) throw new Error('负数没有阶乘') + if (n === 0 || n === 1) return 1 + let result = 1 + for (let i = 2; i <= n; i++) { + result *= i + } + return result +} + +/** + * 判断一个数是否为质数 + * @param {number} n - 正整数 + * @returns {boolean} + */ +export function isPrime(n) { + if (n <= 1) return false + if (n <= 3) return true + if (n % 2 === 0 || n % 3 === 0) return false + for (let i = 5; i * i <= n; i += 6) { + if (n % i === 0 || n % (i + 2) === 0) return false + } + return true +} + +/** + * 计算斐波那契数列的第 n 项 (迭代法) + * @param {number} n - 非负整数 + * @returns {number} 第 n 个斐波那契数 + */ +export function fibonacci(n) { + if (n < 0) throw new Error('下标不能为负数') + if (n === 0) return 0 + if (n === 1) return 1 + let a = 0, b = 1 + for (let i = 2; i <= n; i++) { + const tmp = a + b + a = b + b = tmp + } + return b +} + +/** + * 求两个数的最大公约数 (辗转相除法) + * @param {number} a + * @param {number} b + * @returns {number} 最大公约数 + */ +export function gcd(a, b) { + a = Math.abs(a) + b = Math.abs(b) + while (b !== 0) { + const tmp = b + b = a % b + a = tmp + } + return a +} + +/** + * 求两个数的最小公倍数 + * @param {number} a + * @param {number} b + * @returns {number} 最小公倍数 + */ +export function lcm(a, b) { + if (a === 0 || b === 0) return 0 + return Math.abs(a * b) / gcd(a, b) +}