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

来源:互联网 发布:2017网络实用技术基础 编辑:程序博客网 时间:2024/04/30 08:44
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define N 1000
#define M 10  // 保留小数的位数
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[]); //清楚最前面无用0
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[])
{
    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[N];
    char number4[N];
    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 number5[])
{
    char number4[N];
    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++)
        {
            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';
        int count_n5 = strlen(number4);
        for (int i = 0; i < M; i++)
        {
            int count = 0;
            number4[count_n5] ='0';
            count_n5++;
            number4[count_n5] = '\0';
            while (!Compare(number4, number2))
            {
                Sub(number4, number2, number4);
                count++;
            }
            number5[i] = count + 48;
            
        }
        number5[M] = '\0';
    }
    else
    {
        strcpy(number4, number1);
        int count_n4 = strlen(number4);
        for (int i = 0; i < M; i++)
        {
            int count = 0;
            number4[count_n4] = '0';
            count_n4++;
            number4[count_n4] = '\0';
            while (!Compare(number4, number2))
            {
                Sub(number4, number2, number4);
                count++;
            }
            number5[i] = count + 48;

        }
        number5[M] = '\0';
        number3[0] = '0';
        number3[1] = '\0';
    }
}
void main()
{
    char number1[N];
    char number2[N];
    char number3[N];
    char number5[N];
    Input(number1, number2, N);
    Devide(number1, number2, number3,number5);
    Clear_Zero(number3);
    printf("%s", number3);
    printf(".%s", number5);
    system("pause");
}
0 0
原创粉丝点击