如何在不使用“/”和“%”的情况下有效获得商和余数?

时间:2016-03-03 03:19:31

标签: algorithm math go

我已经实现了一个简单的函数,当除数是1) systemutil.Run "websta.me/tag/graffiti"; 2) Browser("#graffiti Instagram photos").Page("#graffiti Instagram photos").WebButton("<BUTTON class="btn btn-default btn-xs likeButton" type=button data-target=".*.*"><I class="fa fa-heart"></I>Like</BUTTON> ").Click 3)wait(1) 4) Browser("#graffiti Instagram photos").Page("#graffiti Instagram photos").WebButton("<BUTTON class="btn btn-default btn-xs likeButton" type=button data-target=".*.*"><I class="fa fa-heart"></I>Like</BUTTON> ").Click 5) wait(1) 的幂时,它返回商和余数:

10

只是好奇,除了直接使用func getQuotientAndRemainder(num int64, digits uint) (int64, int64) { divisor := int64(math.Pow(10, float64(digits))) if num >= divisor { return num / divisor, num % divisor } else { return 0, num } } /运算符之外,是否有更好的算法来获取商和余数?或者仅在除数是%的力量的情况下?

2 个答案:

答案 0 :(得分:1)

return num / divisor, num % divisor

&#34;算法&#34;是有声的,可以说是最好的方式:有表现力。如果有的话,这部分代码可能过于复杂:

int64(math.Pow(10, float64(digits)))

转换为float64和从int64转换可能是次优的。此外,任何大于18的幂的10将溢出var tableArr = new Array(); var flag = 0; var speed = new Array(); var speed_index = new Array(); var cons = new Array(); var cons_index = new Array(); var dest = new Array(); var dest_index = new Array(); // Gets the values from the table cell and creates the checkboxes function get_values() { if (flag == 0) { flag = 1; $.each(speed, function(i) { $(".top-filter .speed").append('<input type=\'checkbox\' index=' + speed_index[i] + '>&nbsp;' + speed[i] + '<br/>'); }); $.each(cons, function(i, val) { $(".top-filter .cons").append('<input type=\'checkbox\' index=' + cons_index[i] + '>&nbsp;' + cons[i] + '<br/>'); }); $.each(dest, function(i, val) { $(".top-filter .dest").append('<input type=\'checkbox\' index=' + dest_index[i] + '>&nbsp;' + dest[i] + '<br/>'); }); } }; $(document).ready(function() { // to push the values from cell to array $('.table thead tr:nth-child(2) th').each(function(e, a) { if ($(a).attr('name') == 'speed') { speed.push($(this).text()); speed_index.push($(this).index()); } else if ($(a).attr('name') == 'cons') { cons.push($(this).text()); cons_index.push($(this).index()); } else { dest.push($(this).text()); dest_index.push($(this).index()); } }); get_values(); $('input[type=checkbox]').click(function() { var index = $(this).attr('index'); var name = $(this).parent().attr("class"); $('.table thead .this_h th').eq(index).toggleClass('hidden'); var hidden = $('.table thead th.hidden') $.each(hidden, function() { var idx = $(this).index() + 1; $.each($('.table tbody tr'), function() { $(this).find('td').eq(idx).hide(); }); }); var visible = $('.table thead .this_h th:not(.hidden)'); $.each(visible, function() { var idx = $(this).index() + 1; $.each($('.table tbody tr'), function() { $(this).find('td').eq(idx).show(); }); }); var length = $(".table thead tr:nth-child(2)").find("th[name=" + name + "]").filter(':visible').length; if (length === 0) { $(".table thead tr:nth-child(1)").find("th[name=" + name + "]").addClass("hidden"); } else { $(".table thead tr:nth-child(1)").find("th[name=" + name + "]").removeClass("hidden").attr('colspan', length); } }); });。我建议你添加一个健全性检查并用乘法循环替换代码并测量其性能。

但是接下来:如果您关心性能,只需在汇编中实现它。

答案 1 :(得分:1)

显然,你应该运行一些Go基准:Benchmarks, Package testing

您的解决方案看起来效率不高。试试这个:

package main

import "fmt"

func pow(base, exp int64) int64 {
    p := int64(1)
    for exp > 0 {
        if exp&1 != 0 {
            p *= base
        }
        exp >>= 1
        base *= base
    }
    return p
}

func divPow(n, base, exp int64) (q int64, r int64) {
    p := pow(base, exp)
    q = n / p
    r = n - q*p
    return q, r
}

func main() {
    fmt.Println(divPow(42, 10, 1))
    fmt.Println(divPow(-42, 10, 1))
}

输出:

4 2
-4 -2

基准:

BenchmarkDivPow                     20000000            77.4 ns/op
BenchmarkGetQuotientAndRemainder     5000000           296 ns/op