#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
#define Max 1000
/*
函数SubStract功能:
用长度为len1的大整数p1减去长度为len2的大整数p2
结果存在p1中,返回值代表结果的长度
不够减:返回-1 , 正好够:返回0
*/
int SubStract(int *p1, int len1, int *p2, int len2)
{
int i;
if( len1 < len2)
return -1;
if( len1 == len2 )
{
// 判断p1 > p2
for( i=len1-1; i>=0; i-- )
{
if(p1[i] > p2[i]) // 若大,则满足条件,可做减法
break;
else if(p1[i] < p2[i]) // 否则返回-1
return -1;
}
}
for( i=0; i<=len1-1; i++ ) // 从低位开始做减法
{
p1[i] -= p2[i]; // 相减
if(p1[i] < 0) // 若是否需要借位
{
// 借位
p1[i] += 10;
p1[i+1]--;
}
}
for( i=len1-1; i>=0; i-- ) // 查找结果的最高位
{
if( p1[i] ) //最高位第一个不为0
return (i+1); //得到位数并返回
}
return 0; //两数相等的时候返回0
}
int main()
{
char a[Max] = {0}; // 第一个大数
char b[Max] = {0}; // 第二个大数
char sum[Max] = {0}; // 计算结果
while(~scanf("%s%s",a,b))
{
int i, j;
int len1, len2, len=0; //大数位数
int number; //两大数相差位数
int n; //Subtract函数返回值
int c[Max] = {0}; //被除数
int d[Max] = {0}; //除数
int e[Max] = {0}; //商
len1 = strlen(a); //获得大数的位数
len2 = strlen(b);
//将数字字符转换成整型数,且翻转保存在整型数组中
for( j=0, i=len1-1; i>=0; j++, i-- )
c[j] = a[i] - 48;
for( j=0, i=len2-1; i>=0; j++, i-- )
d[j] = b[i] - 48;
if( len1 < len2 ) //如果被除数小于除数,直接返回-1,表示结果为0
{
return -1;
}
number = len1 - len2; //相差位数
for( i=len1-1; i>=0; i-- ) //将除数扩大,使得除数和被除数位数相等
{
if(i >= number)
d[i] = d[i-number];
else //低位置0
d[i] = 0;
}
len2 = len1;
for( j=0; j<=number; j++ ) //重复调用,同时记录减成功的次数,即为商
{
while((n = SubStract(c, len1, d+j, len2-j)) >= 0)
{
len1 = n; //结果长度
e[number-j]++; //每成功减一次,将商的相应位加1
}
}
// 计算商的位数,并将商放在sum字符数组中
for( i=Max-1; e[i]==0 && i>=0; i-- ); //跳过高位0,获取商的位数
if( i >= 0 )
len = i + 1; // 保存位数
for( j=0; i>=0; i--, j++ ) // 将结果复制到sum数组中
sum[j] = e[i] + 48;
sum[j] = '\0'; // sum字符数组结尾置0
//输出结果
printf("%s ÷ %s = ",a, b);
if( len >= 0 )
{
for( i=0; i<len; i++ )
printf("%c", sum[i]);
}
else
{
printf("0");
}
printf("\n\n\n");
a[Max] = {0}; // 第一个大数
b[Max] = {0}; // 第二个大数
sum[Max] = {0};
}
return 0;
}
C语言实现大数相除(代码+注释+运行结果)
最新推荐文章于 2024-03-18 20:27:24 发布