用javascript,objective-c和java分别实现最简单的因式分解

这篇博客介绍了如何用javascript, objective-c和java实现最简单的因式分解。作者提供了因式分解计算器的试用链接,并提到了objective-c版本在更新数据方面的挑战,同时提到了iOS应用中可用的因式分解计算器。" 112469403,10536090,经典控制理论:奈奎斯特稳定判据解析与应用,"['控制理论', '经典控制', '稳定性分析', '仿真技术', '自动控制原理']

一个简单的实现是,先计算获得各个质数,然后根据用户的输入,用每一个质数去试着除,统计后输出即可。

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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值