使用C在整数中获得最大数字的最佳方法是什么?

时间:2010-10-21 14:12:07

标签: c big-o

我只是把C作为一个学习者,并写了这个小function ......

char *getPlaceSuffix(int number) {

    static char *suffixes[] = {"st", "nd", "rd", "th"};

    if (number >= 11 && number <= 13) {
        return suffixes[3];
    } else {
        while (number > 10) {
            number -= 10;   
        }

        if (number >= 1 && number <= 3) {
            return suffixes[number - 1];
        } else {
            return suffixes[3];
        }               
    }
}   

我在Twitter上发布了链接,Konrad Rudolph告诉我,我获取最低有效数字的方法是O(n)并且效率不高。

  

不幸的是,对于非常大的数字来说它是O(n) - 使它成为O(logn),调整while循环以获得更高的10的幂...

Source

我对Big O符号并不太熟悉,但我明白O(n)效率不高?

从我的代码示例中可以看出,我扣除10直到数字长度为一位数,所以我可以比较它以查看哪个后缀合适。我有分区和模数的快速发挥,但无法弄明白。

所以,我的问题是,获得数字中最低位数的最佳方法是什么?

我还在学习,所以请放轻松我:)

谢谢!

6 个答案:

答案 0 :(得分:15)

number % 10

应该有用。

答案 1 :(得分:5)

“快速发挥除法和模数但无法弄明白。”

 number = number % 10

会这样做

如果我们对这段代码的效率感到困扰(为什么?)那么

char *getPlaceSuffix(int number) {

    static char *suffixes[] = {"th", "st", "nd", "rd", "th",  "th", "th", "th", "th", "th"};
    int h = number %100;
    int d = number %10
    return (h == 11 or h == 12 or h == 13)? suffixes[0]:suffixes[d];
} 

答案 2 :(得分:4)

如果number为肯定,则number = number % 10;while (number >= 10) number -= 10;具有相同的效果。请注意,我在代码中使用了>=,而不是>

因此,涵盖了因模数而获得0的情况,你应该是好的。

[编辑:oops,您的代码已经处理0,正确选择th。所以你没事。您尝试使用哪种模数代码?]

“我明白O(n)效率不高?”

您的代码效率不高。 O(n)意味着在n接近无穷大的极限中,您的代码花费的时间不会比n成比例。事实上,我们并不需要担心无穷大的限制,我们不需要担心边界 - 你的循环执行的次数大约与n成正比。

在这种情况下,这是低效的,因为存在更快的解决方案。根据定义,O(1)的解也是O(n),因此O(n)实际上并不意味着“低效”,因为它指定了时间上限,而不是下限。但请注意,这种符号被广泛滥用。人们经常说“O(n)”意味着某些算法需要时间至少与n成比例,当他们应该说“Ω(n)”或“Θ(n)”时。

答案 3 :(得分:3)

模量:

number = number % 10;

答案 4 :(得分:1)

您在网站上发布的功能不正确。如果我们通过它会返回什么?

char *getPlaceSuffix(int number) {
  static char *suffixes[] = {"th", "st", "nd", "rd"};

  if (number >= 11 && number <= 13) { return suffixes[0]; }
  else {  
    number %= 10;

    if (number >= 1 && number <= 3) { return suffixes[number]; }
    else { return suffixes[0]; }
  }
}

113将由10修改,这将导致3,然后它将返回后缀[3],即“rd”。

113应该是113,而不是113(我假设发音为“一百个” - 很有趣,但不正确。)

以下是该函数应如何阅读:

char *getPlaceSuffix(int number) {
  static char *suffixes[] = {"th", "st", "nd", "rd"};

  if (number>100) number %= 100;

  if (number >= 11 && number <= 13) { return suffixes[0]; }
  else {  
    number %= 10;

    if (number >= 1 && number <= 3) { return suffixes[number]; }
    else { return suffixes[0]; }
  }
}

添加if (number>100) number %= 100; 应该使此函数返回正确的答案。

答案 5 :(得分:0)

你能把这个数字和模数加10,这是你最不重要的数字吗?当你扣除10,直到你再也不能,你就是模数的意思。