假设我有n=1234
并且我想x
获得n
. 假设x=2
,在 C 数学中我只是计算1234/100
,我会得到12
。但是我怎样才能以编程方式做到这一点?即,使用数学。我已经通过可怕的方式实现了它,转换为字符串并放置0
在x
位置。如果可能的话,我想避免使用内置的 C 函数,因为我的目标是稍后将算法转换为汇编语言。
问问题
7429 次
4 回答
4
在不使用任何库函数的情况下,最好的方法是使用蛮力。整数可以取的最大值是 2147483648,所以我们不会处理任何超过它的事情。
int first_two(int value)
{
assert(value >= 0); // unspecified for negative numbers
if (value >= 1000000000)
return value / 100000000;
if (value >= 100000000)
return value / 10000000;
if (value >= 10000000)
return value / 1000000;
if (value >= 1000000)
return value / 100000;
if (value >= 100000)
return value / 10000;
if (value >= 10000)
return value / 1000;
if (value >= 1000)
return value / 100;
if (value >= 100)
return value / 10;
return value;
}
于 2013-03-21T16:42:24.803 回答
1
您可以使用以下算法:保持分割n
直到10
你得到n < 10^x
在代码之后
int power10(int x) {
int p = 1;
while (x) {
p *= 10;
x--;
}
return p;
}
int main (void) {
int x = 2;
int n = 1234;
int max = power10(x);
int res = n;
while(res>=max)
res = res/10;
printf("%d\n",res);
}
于 2013-03-21T16:33:33.160 回答
1
您可以通过获取您的数字的十进制对数的底数(如果是 1234,它是floor(3.091315)
,即 3),加一,然后减去n
- 所需的小数位数,以编程方式进行。这会给你x
这样的整数除以原始值10^x
给你想要的结果:
#include <math.h>
...
int num = 12345;
int n = 3;
int log10 = (log(num)/log(10))+1;
int divisor = pow(10, log10-n);
int res = num / divisor;
printf("%d\n", res);
由于涉及数学函数,将上述转换为汇编将是棘手的。您可以通过定义一个十的幂表来简化它,在其中搜索大于或等于所需数字的第一个项目(log10
上面给出了你),然后抓住log10-n
-th 条目,给你pow(10, log10-n)
:
int pow10[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
int main(void) {
int num = 12345;
int n = 3;
int log10 = 0;
while (pow10[log10] < num) {
log10++;
}
int divisor = pow10[log10-n];
int res = num / divisor;
printf("log10(num)+1=%d, divisor=%d, result=%d\n", log10, divisor, res);
return 0;
}
这是修改后的演示。
于 2013-03-21T15:42:15.263 回答
1
int getLeftDigits(double num, double numOfDigits)
{
double divider = pow(10, numOfDigits);
if (num < divider)
return num;
getLeftDigits(num/10, numOfDigits);
}
如果你想避免使用 pow 函数,你可以自己实现它,如这里的其他评论之一所示。
于 2016-01-29T07:40:48.703 回答