2

假设我有n=1234并且我想x获得n. 假设x=2,在 C 数学中我只是计算1234/100,我会得到12。但是我怎样才能以编程方式做到这一点?即,使用数学。我已经通过可怕的方式实现了它,转换为字符串并放置0x位置。如果可能的话,我想避免使用内置的 C 函数,因为我的目标是稍后将算法转换为汇编语言。

4

4 回答 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);

这是关于 ideone 的演示

由于涉及数学函数,将上述转换为汇编将是棘手的。您可以通过定义一个十的幂表来简化它,在其中搜索大于或等于所需数字的第一个项目(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 回答