日期:2014-05-16  浏览次数:20742 次

求C语言写一段代码(关于除法)
根据:
2进制完成除法运算就是移位和相减,比如1011011除以1110顺序如下: 
  1 - 1110 不够减, 结果添0, 1左移一位再加上原来1后的0,为10 
  10 - 1110 不够减, 结果添0, 10左移一位再加上原来10后的1,为101 
  101 - 1110 不够减, 结果添0, 101左移一位再加上原来101后的1,为1011 
  1011 - 1110 不够减, 结果添0, 1011左移一位再加上原来1011后的0,为10110 
  10110 - 1110 = 1000 结果添1,同上左移加原来10110后的1得 10001 
  10001 - 1110 = 11 结果添1,同上左移加原来101101后的1得 111 
  111 - 1101 不够减,结果添0,此时1011011所有位都已移完,运算完毕 
  即 1011011 = 1110 * 0110 + 111 
也即 91 = 14 * 6 + 7 
由于你相除的两个数放在两个数组中,比如A[]与B[],要模拟这种运算的话就需要能不 
断地从A中取出其二进制的高位,添加到一个当前值的数组C[]中,而实际进 
行运算的就是C与B。数组单元的类型必然是多位的,你必须要实现做到对数组C[]左移 
一位的操作,剩下的就是判断C够不够减B(即C数组的数是不是比B大)了。 

至于左移,我想大家都想到了,其实C和B是倒序存放的,以数组单元为8位为例, 
C[0]存放着C的最低8位,用表达式表示就是 C[0] = C & 0xff, C[1] = C & 0xff00, ... 
这样当移位时,只要保留当前单元C[i]的最高位,即h = C[i] > > 7,然后直接对 
C[i]左移一位即 C[i] < <1,然后再加上上一单元C[i-1]保留的最高位就得到当前的C[i]了。 
对于C[0]来说,它的上一单元的最高位自然就是A的最高位了。



写一段代码:

要求:
  1.被除数为64位的数(数组最小单位必须使用8bit)
  2.除数为32位的数(同上)
  3.需要得到的结果为商和余数

------解决方案--------------------
C/C++ code
#include <string.h>
#include <stdio.h>
#define len1 (8)
#define len2 (4)
int ncmp(unsigned char const *a, unsigned char const *b, int n)
{
    int i;
    for (i = n - 1; i >= 0; i--)
        if (a[i] > b[i])
            return 1;
        else if (a[i] < b[i])
            return -1;
    if (i < 0)
        return 0;
}
int nsub(unsigned char *a, unsigned char *b, int n)
{
    int i, carry = 0;
    for ( i = 0; i < n; i++) {
        a[i] -= carry;
        if (a[i] < b[i]) {
            a[i] = 0xff - b[i] + 0x01 + a[i];
            carry = 1;
        } else
            a[i] -= b[i];
    }
    return 0;
}
int nshr(unsigned char *a, int n)
{
    int i;
    for (i = n - 1; i > 0; i--) {
        a[i] <<= 1;
        a[i] |= (a[i - 1] >> 7);
    }
    a[0] <<= 1;
}
int div(unsigned char a[], unsigned char b[], unsigned char c[])
{
    unsigned char x[len2];    
    int i, j;
    memset(x, 0, sizeof(x));
    memset(c, 0, sizeof(unsigned char) * len1);

    for (i = 0; i < 8 * len1; i++) {
        nshr(x, len2);
        nshr(c, len1);
        x[0] |= (a[len1 - 1] >> 7);
        if (ncmp(x, b, len2) >= 0) {
            c[0] |= 1;
            nsub(x, b, len2);
        }
        nshr(a, len1);
    }
    memcpy(a, x, sizeof(x));
}
int main()
{
    unsigned char a[8], b[8], c[8];
    unsigned long long *a_l = (unsigned long long *)a;
    unsigned long long *b_l = (unsigned long long *)b;
    unsigned long long *c_l = (unsigned long long *)c;
    *a_l = 1124141234;
    *b_l = 123;
    div(a, b, c);
    printf("a = %ld\n", *a_l);
    printf("c = %ld\n", *c_l);
    return 0;
}

------解决方案--------------------
C/C++ code

/*
 a[] 被除数
 b[] 除数
 c[] 商
 余数放回a[]里面
*/
int div(unsigned char a[], unsigned char b[], unsigned char c[])