您的位置:首页 > 编程语言 > C语言/C++

C语言,大数除法,不支持小数

2016-04-29 12:40 465 查看
#define _CRT_SECURE_NO_WARNINGS

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#define N 1000

void Input(char number1[], char number2[], int n);//输入数据

void Change_str(char number[], int n);//数组前后互换

void Sub(char number1[], char number2[], char number3[]);//实现减法

int Compare(char number1[], char number2[]); //判断两个数的大小,大则返回0,小则返回1

void Clear_Zero(char number[]);

void Input(char number1[], char number2[], int n)//输入数据

{

scanf("%s%s", number1, number2);

int length_n1 = strlen(number1);

int length_n2 = strlen(number2);

if (length_n1 > n || length_n2 > n)

{

printf("ERROR:输入的数据超出范围!");

system("pause");

exit(1);

}

int flag = 0;

for (int i = 0; i < length_n2; i++)

{

if (number2[i] != '0')

{

flag = 1;

break;

}

}

if (flag == 0)

{

printf("ERROR:除数不能为0!");

system("pause");

exit(1);

}

}

void Change_str(char number[], int n)//数组前后互换

{

for (int i = 0; i < n / 2; i++)

{

char temp = number[i];

number[i] = number[n - i - 1];

number[n - i - 1] = temp;

}

}

void Clear_Zero(char number[]) //清理前方无用的0

{

int length = strlen(number);

int flag = 0;

int count = 0;

for (int i = 0; i < length; i++)

{

if (flag == 0)

{

if (number[i] == '0')

{

count++;

}

else

{

flag = 1;

}

}

}

if (count == length)

{

number[0] = '0';

number[1] = '\0';

}

else

{

for (int i = 0; i < length - count; i++)

{

number[i] = number[i + count];

}

number[length - count] = '\0';

}

}

void Sub(char number1[], char number2[], char number3[])//实现减法

{

int length_n1 = strlen(number1);

int length_n2 = strlen(number2);

Change_str(number1, length_n1);

Change_str(number2, length_n2);

int sub_number;

int one;

int ten = 0;

for (int i = 0; i < length_n2; i++)

{

if (ten == 0)

{

sub_number = (number1[i] - 48) - (number2[i] - 48);

if (sub_number < 0)

{

one = 10 + sub_number;

ten = 1;

number3[i] = one + 48;

}

else

{

number3[i] = sub_number + 48;

}

}

else if (ten == 1)

{

sub_number = (number1[i] - 48) - (number2[i] - 48) - 1;

if (sub_number < 0)

{

one = 10 + sub_number;

ten = 1;

number3[i] = one + 48;

}

else

{

number3[i] = sub_number + 48;

ten = 0;

}

}

}

for (int i = length_n2; i < length_n1; i++)

{

if (ten == 0)

{

number3[i] = number1[i];

}

else if (ten == 1)

{

sub_number = (number1[i] - 48) - 1;

if (sub_number < 0)

{

one = 10 + sub_number;

ten = 1;

number3[i] = one + 48;

}

else

{

number3[i] = sub_number + 48;

ten = 0;

}

}

}

number3[length_n1] = '\0';

Change_str(number3, length_n1);

Change_str(number2, length_n2);

}

int Compare(char number1[], char number2[]) //判断两个数的大小,大则返回0,小则返回1

{

int minus;//判断符号

char number3
;

char number4
;

strcpy(number3, number1);

strcpy(number4, number2);

Clear_Zero(number3);

Clear_Zero(number4);

int length_n1 = strlen(number3);

int length_n2 = strlen(number4);

if (length_n1 > length_n2)

{

minus = 0;

}

else if (length_n1 < length_n2)

{

minus = 1;

}

else

{

for (int i = 0; i <length_n1; i++)

{

if (number3[i] > number4[i])

{

minus = 0;

break;

}

else if (number3[i] < number4[i])

{

minus = 1;

break;

}

else

{

minus = 0;

}

}

}

return minus;

}

void Devide(char number1[], char number2[], char number3[]) //实现除法

{

char number4
;

int length_n1 = strlen(number1);

int length_n2 = strlen(number2);

int minus = Compare(number1, number2);

if (minus == 0)

{

for (int j = 0; j < length_n2; j++)

{

number4[j] = number1[j];

}

number4[length_n2] = '\0';

int count_n4 = length_n2;

for (int i = 0; i < (length_n1 - length_n2 + 1); i++)

{

//printf("%d\n", i);

int count = 0;

while (!Compare(number4, number2))

{

Sub(number4, number2, number4);

count++;

}

number3[i] = count + 48;

number4[count_n4] = number1[count_n4];

count_n4++;

number4[count_n4] = '\0';

}

number3[length_n1 - length_n2 + 1] = '\0';

}

else

{

number3[0] = '0';

number3[1] = '\0';

}

}

void main()

{

char number1
;

char number2
;

char number3
;

Input(number1, number2, N);

Devide(number1, number2, number3);

Clear_Zero(number3);

printf("%s", number3);

system("pause");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: