【发布时间】:2016-03-18 11:33:51
【问题描述】:
我想知道在 C 中是否有特定的算法可以做到这一点。 不过我想出了一些方法。
问题:我有 2 个以 7 为底的数字。这些数字是可整除的,所以我的答案总是一个整数。我想计算商。
最简单的方法可能是将我在基数 10 中的两个数字从基数 7 转换,然后使用 / 运算符进行正常除法,然后将答案重新转换回基数 7。
这种方法有很多缺点,耗时过长,主要是溢出。如果除数的长度超过大约 (17-19),则转换为以 10 为底的数字将不适合 long 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 为底的商,形式与输入相同。
【问题讨论】:
-
实际上有一种比机械计算器时代使用的直接重复乘法更快的方法,类似于长除法。至于实际的加法/乘法,您可以只拥有一个数字数组并一次使用一个数字列。
-
你的以 7 为基数的数字是如何表示的?
-
是的,但这会导致溢出。我正在划分的数字的长度非常大,将超出 long long int 的范围。如果我可以直接转换解决它,那么这个问题就没有意义了。
-
我的红利可以有大约 10^3-6 的长度(整数形式)。除数可以说是 10^4-5。我正在尝试为较小的情况考虑一个解决方案,例如数字的整数形式的长度约为 20 位(大约在它刚刚溢出时)(被除数),所以很明显除数的长度约为(
-
7^22 仍小于 2^64。
标签: c base integer-division base-conversion