高精度除法(高精度除以低精度)

问题一:解决数组的越界问题

被除数作为高精度数,在进行相除仍然需要以字符串的形式,相除后存在数组里,与之不同的是大数在存入数组时不需要进行反转,直接存入即可。

问题二:计算结果数组长度

高精度除以低精度结果最多与高精度的位数相同,因此结果数组的长度与高精度数的长度相同即可。

问题三:内部除法计算

根据乘法的竖式,在每一位上的数等于上一位的余数乘10加上该位上的数字,再除以除数。而每一次除法运算得到的余数等于上一位的余数乘10加上该位上的数字对除数取模。

问题四:去除多余的零

由于数组并不是倒叙的,所以从第一位开始看,如果是0,则跳过,从下一位开始打印。

问题五:打印数组

正序打印即可。

代码如下:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
string s;
int a[101], c[101];
void strintoint(string str,int des[])
{
	for (int i = 0; i <= str.size(); i++)
	{
		des[i+1] = str[i] - '0';
	}
}

int main()
{
	int b = 0;
	cin >>s>> b;
	strintoint(s, a);
	int la = s.size();
	int tmp = 0;
	for (int i = 1; i <= la; i++)
	{
		c[i] = (tmp * 10 + a[i]) / b;
		tmp = (tmp * 10 + a[i]) % b;
	}
	int lc = 1;
	while (c[lc] == 0 && lc < s.size()) lc++;
	for (int i=lc; i <= s.size(); i++) cout << c[i];
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言实现高精度除法高精度除以高精度)可以通过字符串和数组来实现。下面是一个示例代码: ```c #include <stdio.h> #include <string.h> #define MAX_LEN 1000 void divide(char dividend[], char divisor[], char quotient[]) { int len1 = strlen(dividend); int len2 = strlen(divisor); int i, j, k; // 将被除数和除数转换为整型数组 int num1[MAX_LEN], num2[MAX_LEN]; for (i = 0; i < len1; i++) { num1[i] = dividend[i] - '0'; } for (i = 0; i < len2; i++) { num2[i] = divisor[i] - '0'; } // 初始化商和余数 int result[MAX_LEN], remainder[MAX_LEN]; memset(result, 0, sizeof(result)); memset(remainder, 0, sizeof(remainder)); // 从高位到位进行除法运算 for (i = 0; i < len1; i++) { // 将余数左移一位,加上当前位的数字 for (j = len2 - 1; j >= 0; j--) { remainder[j + 1] = remainder[j]; } remainder[0] = num1[i]; // 计算当前位的商 for (j = 0; j < 10; j++) { if (compare(remainder, num2, len2) >= 0) { subtract(remainder, num2, len2); result[i]++; } else { break; } } } // 将商转换为字符串 int len = 0; for (i = 0; i < len1; i++) { if (result[i] != 0) { break; } } for (; i < len1; i++) { quotient[len++] = result[i] + '0'; } quotient[len] = '\0'; } int compare(int num1[], int num2[], int len) { for (int i = 0; i < len; i++) { if (num1[i] > num2[i]) { return 1; } else if (num1[i] < num2[i]) { return -1; } } return 0; } void subtract(int num1[], int num2[], int len) { for (int i = len - 1; i >= 0; i--) { if (num1[i] < num2[i]) { num1[i] += 10; num1[i - 1]--; } num1[i] -= num2[i]; } } int main() { char dividend[MAX_LEN], divisor[MAX_LEN], quotient[MAX_LEN]; printf("请输入被除数:"); scanf("%s", dividend); printf("请输入除数:"); scanf("%s", divisor); divide(dividend, divisor, quotient); printf("商为:%s\n", quotient); return 0; } ``` 这段代码实现了高精度除法,通过将被除数和除数转换为整型数组,然后从高位到位进行除法运算,最后将商转换为字符串输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值