基数N

时间:2015-12-12 16:54:23

标签: c base integer-division base-conversion

我想知道是否有一个特定的算法在C中执行此操作。 然而我提出了一些方法。

问题:我在基数7中有2个数字。数字是可分的,所以我的答案总是一个整数。我希望计算商数。

最简单的方法可能是将基数为10的数字从基数7转换,然后使用/运算符进行正常除法,然后将回答重新转换回基数为7。

这种方法有很多缺点,耗时过多,主要是溢出。如果divide的长度超过大约(17-19),则转换为10的基数不会适合长long int。

看了很多之后,一个简单的方法就是重复乘法。 例202和13 我可以在基数7中重复添加13,直到多次必须添加才能得到202.这就是答案。但是我无法思考如何将它们相乘。

我要求帮助的是什么?:算法/伪代码或代码(C / C ++,因为这是我所知道的唯一语言),用于分割两个数字,并在基数7中得到商。结果将是一个完美的整数。

非常感谢你。

#define max 2000

long long int bconvert(long long int x) //conversion from base 7 to decimal
{   long long int i=0,ans=0;
    while(x>0)
    {
    ans+=(x%10)*pow(7,i);
    x/=10;
    i++;
}
return ans;
}

 int main() {
long long int A,B,L,a,b,c,C,arr[max],i,j,k,arr1[max],r;
    scanf("%lld %lld %lld",&A,&B)
    a=bconvert(A);
    b=bconvert(B);
    c=a/b; //decimal division
    k=0;
    C=0;
    while(c>0)
    {
        r=c%7;
        c/=7;
        C+=r*pow(10,k);
        k++;
    }
    cout<<C<<endl;

输出是基数7中的商,与输入的形式相同。

3 个答案:

答案 0 :(得分:0)

您可以直接在输入字符串上实现long division algorithm

另一种选择是将数字转换为基数16807(7 ** 5)中的任意精度整数,在该基数中进行除法并将结果转换回基数7.

答案 1 :(得分:0)

很抱歉,没时间发布完整的代码(今天晚些时候会这么做),但以下至少是&#34;字符串&#34;分裂。

#include <stdlib.h>
#include <string.h>

// Assume no illegal characters
char *strdivide(char *quotient, const char *dividend, const char *divisor, 
    unsigned base) {
  // consume leading zeros
  while (*dividend == '0' && dividend[1]) dividend++;
  while (*divisor == '0' && divisor[1]) divisor++;
  // Detect /0
  if (strcmp(divisor, "0")==0) {
    return "Division by 0";
  }
  // Detect dividend obviousl smaller than divisor
  size_t dd_size = strlen(dividend);
  size_t dv_size = strlen(divisor);
  if (dd_size < dv_size) {
    return strcpy(quotient, "0");
  }

  // Work with copy of dividend
  char div[dd_size + 1];
  memcpy(div, dividend, dd_size + 1);

  // Form quotient
  size_t places = dd_size - dv_size;
  for (size_t i = 0; i<=places; i++) {
    // Assume ASCII
    int digit = 0;
    while (strcmp(div, divisor) >= 0)) {
      int borrow = 0;
      for (unsigned j = dv_size; j-- > 0; ) {
        int diff = value(div[j]) - value(divisor[j]) - borrow;
        if (diff < 0) {
          diff += base;
          borrow = 1;
        } else {
          borrow = 0;
        }
        div[j] = unvalue(diff);
      }
    }
    quotient[i] = unvlaue(digit); // int to char
  }
  quotient[i] = '\0';
  // Check for leading 0 in `quotient[]`, shift if needed.
  return quotient;
}

答案 2 :(得分:0)

  

我要求帮助的是什么?:算法/伪代码或代码(C / C ++,as   对于两个数字的划分,这是我所知道的唯一语言   得到基数为7的商。

将基数为7的数字解释为基数为10的数字。相反,根据输入和输出的真实基数转换数字;那很简单。

#include <stdio.h>
#include <stdlib.h>

long long scanbase7()
{
    char str[24];
    return scanf("%23s", str) > 0 ? strtoll(str, NULL, 7) : -1;
}

void printbase7(long long n)
{
    long long p = 1;
    while (n/p > 7) p *= 7;
    do putchar('0'+n/p), n %= p; while (p /= 7);
    puts("");
}

int main()
{
    long long a, b, c;
    a = scanbase7();
    b = scanbase7();
    c = a/b;
    printbase7(c);
}