我想知道是否有一个特定的算法在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中的商,与输入的形式相同。
答案 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);
}