一个简单的实现是,先计算获得各个质数,然后根据用户的输入,用每一个质数去试着除,统计后输出即可。
function compute(v) {
if (p.length == 0) {
p.push(2);
p.push(3);
for (var i=5; i<5000000; i+=2) {
var good = 1;
for (var j=0; j<p.length; j++) {
if (i % p[j] == 0) {
good = 0;
break;
}
if (p[j] * p[j] > i) break;
}
if (good == 1)
p.push(i);
}
}
var ans = [];
var s = "";
var temp = v;
for (var i=0; i<p.length; i++) {
if (v == 1) break;
if (p[i] * p[i] > v) break;
while (v % p[i] == 0) {
if (s.length > 0) s = s + " x ";
s += p[i];
v = v / p[i];
}
}
if (v > 1) {
if (s.length > 0) s = s + " x ";
s += v;
}
if (s.length == 0)
s = "1";
$('#display_label')[0].innerHTML = temp + ' = ' + s;
};
可以在这里试一试效果。我的工具箱 - 因式分解计算器
这里还有objective-c版本,objectivec的版本就是更新数据组的数据比较麻烦,应该有更好的办法。
- (NSString *)__getResult:(NSString *)text
{
NSString *numbers = @"0123456789";
NSMutableArray *values = [[NSMutableArray alloc] init];
for (int i=0; i<text.length; i++) {
NSString *c = [text substringWithRange:NSMakeRange(i, 1)];
[values addObject:@([numbers rangeOfString:c].location)];
}
BOOL zero = YES, one = YES;
if ([[values objectAtIndex:values.count - 1] intValue] != 0) zero = NO;
if ([[values objectAtIndex:values.count - 1] intValue] != 1) one = NO;
for (int i=0; i<values.count-1; i++) {
if ([[values objectAtIndex:i] intValue] != 0) {
zero = NO;
one = NO;
}
}
if (zero) return [NSString stringWithFormat:@"%@ = 0", text];
if (one) return [NSString stringWithFormat:@"%@ = 1", text];
NSMutableString * ret = [[NSMutableString alloc] init];
if (_primes.count == 0) [self __computePrimes];
for (int i=0; i<_primes.count; i++) {
if ([self __isOne:values]) break;
int v = [[_primes objectAtIndex:i] intValue];
while ([self __canDivide:values with:v]) {
if (ret.length > 0)
[ret appendString:@" x "];
[ret appendString:[NSString stringWithFormat:@"%d", v]];
values = [self __divide:values with:v];
}
}
if (![self __isOne:values]) {
if (ret.length > 0)
[ret appendString:@" x "];
for (int i=0; i<values.count; i++)
[ret appendFormat:@"%@", [values objectAtIndex:i]];
}
return [NSMutableString stringWithFormat:@"%@ = %@", text, ret];
}
- (BOOL)__canDivide:(NSMutableArray *)values with:(int)v
{
int current = 0;
for (int i=0; i<values.count; i++) {
current = current * 10 + [[values objectAtIndex:i] intValue];
current %= v;
}
return current == 0;
}
- (NSMutableArray *)__divide:(NSMutableArray *)values with:(int)v
{
int current = 0;
NSMutableArray *ret = [[NSMutableArray alloc] init];
for (int i=0; i<values.count; i++) {
int n = [[values objectAtIndex:i] intValue];
current = current * 10 + n;
int temp = current / v;
if (ret.count > 0 || temp > 0)
[ret addObject:@(temp)];
current %= v;
}
return ret;
}
- (BOOL)__isOne:(NSMutableArray *)values
{
if ([[values objectAtIndex:values.count-1] intValue] != 1) return NO;
for (int i=0; i<values.count-1; i++) {
int v = [[values objectAtIndex:i] intValue];
if (v != 0) return NO;
}
return YES;
}
- (void)__computePrimes
{
[_primes addObject:@(2)];
[_primes addObject:@(3)];
for (int i=5; i<1000000; i+=2) {
BOOL valid = YES;
for (int j=0; j<_primes.count; j++) {
int v = [[_primes objectAtIndex:j] intValue];
if (v * v > i) break;
if (i % v == 0) {
valid = NO;
break;
}
}
if (valid)
[_primes addObject:@(i)];
}
}
可以到 iOS应用 我的工具箱 - 因式分解计算器 试用效果
接下来是java版本。
private String getResult(String text) {
boolean one = true, zero = true;
if (text.charAt(text.length()-1) != '0') zero = false;
if (text.charAt(text.length()-1) != '1') one = false;
for (int i=0; i<text.length()-1; i++)
if (text.charAt(i) != '0') {
one = false;
zero = false;
}
if (one) return text + " = 1";
if (zero) return text + " = 0";
if (primes.size() == 0) {
primes.add(2);
primes.add(3);
for (int i = 5; i < 1000000; i += 2) {
boolean valid = true;
for (Integer k : primes) {
if (k * k > i) break;
if (i % k == 0) {
valid = false;
break;
}
}
if (valid)
primes.add(i);
}
}
ArrayList<Integer> values = new ArrayList<>();
for (int i = text.length() - 1; i >= 0; i--)
values.add(text.charAt(i) - '0');
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < primes.size(); i++) {
if (isOne(values)) break;
while (canDivide(values, primes.get(i))) {
values = divide(values, primes.get(i));
if (buffer.length() > 0)
buffer.append(" x ");
buffer.append(primes.get(i));
}
}
if (!isOne(values)) {
if (buffer.length() > 0)
buffer.append(" x ");
for (int i = values.size() - 1; i >= 0; i--)
buffer.append(values.get(i));
}
return text + " = " + buffer.toString();
}
private ArrayList<Integer> divide(ArrayList<Integer> values, Integer v) {
ArrayList<Integer> ret = new ArrayList<>();
Integer current = 0;
for (int i = values.size() - 1; i >= 0; i--) {
current = current * 10 + values.get(i);
if (ret.size() > 0 || current / v > 0)
ret.add(0, current / v);
current %= v;
}
if (ret.size() == 0)
ret.add(1);
return ret;
}
private boolean canDivide(ArrayList<Integer> values, Integer v) {
Integer current = 0;
for (int i = values.size() - 1; i >= 0; i--) {
current = current * 10 + values.get(i);
current %= v;
}
return current == 0;
}
private boolean isOne(ArrayList<Integer> values) {
if (values.get(0) != 1) return false;
for (int i = 1; i < values.size(); i++)
if (values.get(i) != 0)
return false;
return true;
}
这篇博客介绍了如何用javascript, objective-c和java实现最简单的因式分解。作者提供了因式分解计算器的试用链接,并提到了objective-c版本在更新数据方面的挑战,同时提到了iOS应用中可用的因式分解计算器。"
112469403,10536090,经典控制理论:奈奎斯特稳定判据解析与应用,"['控制理论', '经典控制', '稳定性分析', '仿真技术', '自动控制原理']

170

被折叠的 条评论
为什么被折叠?



