条形图轴的正确通用计算

时间:2017-10-02 20:39:42

标签: algorithm

是否有通用的可靠计算条形图轴的方法? 我正在寻找一种算法,应该向下舍入到下一个“正确的”数字。

在下面的条形图中,y轴为0 - 300,序列步长为75 In the image the y-axis is 0 - 300 with a sequence step of 75

我认为这个算法应该接受一组数字并且:

a)确定最小值/最大值(在这种情况下为25和250)

b)确定“适当的”最大值(在这种情况下为300)

如果最小/最大值为25/240 - “正确”最大值为250.超过250的任何值将导致“适当”最大值为300.

我正在寻找一种简化任意数字的智能方法。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我已经在这里补充说,225的输出将来自此算法的230而不是OP所要求的300。原因:我的实施就是这样。这个问题没有任何正确的答案。不仅仅是编码,这是一个设计问题。

想法:使用int到int的映射,如果,key是数字,那么value应该添加到它以获得适当的数字。从右端提取输入的数字并继续改进从右端开始向左移动一位数字的数字。

地图(我们称之为添加)将具有{键,值}对,如:

  

{1,9},{2,8},......,{9,1},{20,0},...,{90,10},......

请注意,您不需要向其添加每个整数。如果正确使用地图,只添加一些整数就足够了。

以下是您从输入数字中获取正确值的代码/伪代码:

int GetProperNumber(int input) {
    //Init a variable to keep track of the sign
    int multiplier = 1;

    //For negative numbers, taking some precaution...
    if (input < 0) {
        input *= -1;
        multiplier *= -1;
    }

    //For cases where the input number is only 1 or 2 digits, some quick checks...
    int numberOfDigits = GetNumberOfDigitsInInput(input);
    if (numberOfDigits == 1) return (input + additive[input]) * multiplier;
    if (numberOfDigits == 2) return (input + additive[input - input/10]) * multiplier;

    //Now, coming to the core of the method
    int divisor = 10; //We'll use it to get the left part from the input
    while (true) {

        //First, get right part of the number
        int inputWithDigitsRemoved = input / divisor;

        //If the leftover part is too small, i.e. we have reached the last digit,
        //then break as we have now rounded the number off pretty well.
        if (inputWithDigitsRemoved <= 9) break;

        int inputWithDigitsMasked = inputWithDigitsRemoved * divisor;
        int right = input - inputWithDigitsMasked;

        //Since the number is still not rounded to the right magnitude, 
        //the result should be further improved.
        if (additive.Contains(right)) input += additive[right];
        divisor *= 10;
    }
    return input * multiplier;
}

一些样本结果将是:

输入= 5,输出= 10

输入= 99,输出= 100

输入= 2541,输出= 2600