当前位置: 首页 > 知识库问答 >
问题:

以N为基数划分

龚振濂
2023-03-14

我想知道在C中是否有特定的算法来做到这一点。然而,我想出了一些方法。

问题是:我有两个7进制的数字。这些数字是可以整除的,所以我的答案总是整数。我想计算一下商。

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

这种方法有很多缺点,时间消耗过多,主要是溢出。如果divident的长度超过大约(17-19),则转换为基数10时的数字将不适合长整型。

在看了很多之后,一个简单的方法是重复乘法。示例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个答案

苍阳成
2023-03-14

我在寻求什么帮助?:一种算法/伪代码或代码(C/C,因为这是我唯一知道的语言),用于除以两个数字,并以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);
}
赵刚豪
2023-03-14

抱歉,没有时间发布完整的代码(今天晚些时候会做很多),但以下至少是“字符串”划分的一个很好的大纲。

#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;
}
东郭昌胤
2023-03-14

您可以直接在输入字符串上实现长除法算法

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

 类似资料:
  • 本文向大家介绍加基数n,包括了加基数n的使用技巧和注意事项,需要的朋友参考一下 在这个问题上,给出了两个数字。这些数字的底数为n。我们还必须在以n为底的加法中找到这些数字的结果。 首先,将数字转换为十进制数字。从十进制值中,我们可以简单地将它们相加。最后,数字再次转换为以n为底的数字。 n个基数以字符串形式给出,因为对于那些基数大于9的数字,它可能包含一些字母来表示数字,例如十六进制数字,则有6个

  • 问题内容: 从有关对数的numpy文档中,我发现了以 e ,2和10为底取对数的函数: 但是,如何在numpy中使用以 n 为底的对数(例如42)? 问题答案: 要使用自定义底数获取对数,请使用: 要使用自定义底数获取对数,请使用: 如您所料,请注意默认情况下。 提醒一下,对数基数更改规则是:

  • 我一直陷在这个问题中,找不到有效的解决办法。 我有N(高达1000万)说最大100个元素的数组。这些数组包含1-10000的数字。 现在我的问题是将这些数组划分为K个组,这样我就可以最小化所有数组中的重复项,即一个数组包含1,4,10,100,另一个数组包含1100。我希望他们进入同一组,因为这样可以最大限度地减少口是心非。我的问题的两个限制条件如下- > 组中向量的数量应均匀分布。 根据大小以递

  • 问题内容: 我对Apache Spark和Python比较陌生,想知道像我将要描述的东西是否可行? 我有一个格式为[m 1,m 2,m 3,m 4,m 5,m 6, … m n ]的RDD(运行rdd.collect()时会得到这个)。我想知道是否有可能将此RDD转换为[[m 1,m 2,m 3),(m 4,m 5,m 6).....(m n-2, m n-1,m n)]。内部元组的大小应为k。如

  • 如何将整数数组划分为N个子集,使这些子集的和最小? 例如,数组由11个元素组成,我需要其中的6个子集。 子集:<code>{2,1,1,3},{4},}4,3},}3,2},1,2},{3}</code>最小和=7。 另一个答案是:最小和=7。 注意:在分区时,必须保持数字在原始集合中出现的顺序。

  • 该问题给出了两个输入:数组(arr)和由数组构成子数组的次数(n)。子数组的和应该是奇数 已经很清楚,如果所有的数字都是偶数。奇数和子数组是不可能的。对于奇数和,连续的2个数字应该是奇数+偶数或者偶数+奇数。但我似乎不能把它们分成N个子数组。请帮忙解释一下逻辑。