大数相除

此程序思想参考别处
#include <iostream>
#include <cstring>
using namespace std;
int num1[210]={0};
int num2[210]={0};
int ff(int num1[],int num2[],int len1,int len2)
{
if(len1<len2)
{
return -1;
}
if(len1==len2)
{
for(int i=len1-1;i>=0;i--)
{
if(num1[i]<num2[i])
return -1;
}
}
for(int i=0;i<len1;i++)
{
num1[i]=num1[i]-num2[i];
if(num1[i]<0)
{
num1[i] = num1[i]+10;
num1[i+1]--;
}
}
for(int i=len1-1;i>=0;i--)
{
if(num1[i]!=0)
{
return i+1;
}
}
return 0;
}
int main()
{
char str1[210];
char str2[210];
int result[210];
memset(result,0,sizeof(result));
cin>>str1>>str2;
int len1 = strlen(str1);
int len2 = strlen(str2);
for(int i=0;i<len1;i++)
{
num1[len1-1-i] = str1[i]-'0';


}
for(int i=0;i<len2;i++)
{
num2[len2-1-i] = str2[i]-'0';
}
int len = ff(num1,num2,len1,len2);
if(len<0)
{
cout<<"0"<<endl;
return 0;
}
else if(len == 0)
{
cout<<"1"<<endl;
return 0;
}
result[0]++;
int d = len-len2;
for(int i=len-1;i>=0;i--)
{
if(i>=d)
{
num2[i] = num2[i-d];
}
else
{
num2[i] = 0;
}


}
len2 = len;
for(int i=0;i<=d;i++)
{
int temp;
while((temp = ff(num1,num2+i,len,len2-i))>=0)
{
len = temp;
result[d-i]++;
}
}
for(int i=0;i<210;i++)
{
if(result[i]>=10)
{
result[i+1] += result[i]/10;
result[i] = result[i]%10;
}
}


int i=209;
while(result[i]==0)i--;
for(int j=i;j>=0;j--)
cout<<result[j];
cout<<endl;
return 0;


}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的我会尽力回答你的问题。大数相除算法可以使用长除法来实现。具体步骤如下: 1. 将被除数和除数表示为字符串,将它们转换为整数数组。 2. 根据除法的规则,从被除数的最高位开始,依次取出与除数相同位数的数进行除法运算。 3. 如果除数比被除数的当前部分小,则将当前部分向左依次加上小数点后面的数,直到满足除数大于等于当前部分为止。 4. 第一步中取出的数,减去第三步中得到的结果,即为当前的商。 5. 将第三步得到的结果与第一步中取出的数相减,得到当前的余数。 6. 重复执行2~5步,直到被除数的所有位数都被处理完毕。 7. 最终余数即为除法运算的余数,将所有的商拼接起来,即为除法运算的商。 以上就是实现大数相除算法的基本步骤。相应的C语言代码如下(仅供参考): ```C #include <stdio.h> #include <string.h> #define MAX_LEN 10000 void BigIntegerDivide(char a[], char b[], char res[]) { int la = strlen(a), lb = strlen(b); int numA[MAX_LEN], numB[MAX_LEN], numRes[MAX_LEN]; memset(numA, 0, sizeof(numA)); memset(numB, 0, sizeof(numB)); memset(numRes, 0, sizeof(numRes)); int i, j, k; for (i = la - 1, j = 0; i >= 0; --i) numA[j++] = a[i] - '0'; for (i = lb - 1, j = 0; i >= 0; --i) numB[j++] = b[i] - '0'; for (i = la - 1; i >= 0; --i) { for (k = 0; k < MAX_LEN; ++k) numRes[k] *= 10; for (k = MAX_LEN - 1; k > 0; --k) numRes[k] += numRes[k - 1]; numRes[0] += numA[i]; for (j = 0; j < MAX_LEN; ++j) { if (numRes[j] < numB[lb - 1]) continue; int d = numRes[j] / numB[lb - 1]; for (k = 0; k < lb; ++k) { numRes[j + k] -= d * numB[k]; if (numRes[j + k] < 0) { numRes[j + k] += 10; --numRes[j + k + 1]; } } numRes[j + lb] += d; break; } } int pos = MAX_LEN - 1; while (pos > 0 && numRes[pos] == 0) --pos; for (i = pos, j = 0; i >= 0; --i) res[j++] = numRes[i] + '0'; res[j] = '\0'; } int main() { char a[MAX_LEN], b[MAX_LEN], res[MAX_LEN]; printf("Enter dividend: "); scanf("%s", a); printf("Enter divisor: "); scanf("%s", b); BigIntegerDivide(a, b, res); printf("Result: %s\n", res); return 0; } ``` 以上代码实现了一个基于长除法大数相除算法,可以处理非常大的数。需要注意的是,由于我们使用了整型数组,因此最大能处理的数位数受到了数组大小的限制。可以根据需要适当调整数组大小,以处理更大的数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值