我只是把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的幂...
我对Big O符号并不太熟悉,但我明白O(n)效率不高?
从我的代码示例中可以看出,我扣除10直到数字长度为一位数,所以我可以比较它以查看哪个后缀合适。我有分区和模数的快速发挥,但无法弄明白。
所以,我的问题是,获得数字中最低位数的最佳方法是什么?
我还在学习,所以请放轻松我:)
谢谢!
答案 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,直到你再也不能,你就是模数的意思。