大数运算(压位)

calc++

压位操作记录

#include<stdio.h>   
#include<string.h>   
#include<math.h>   
#include<stdlib.h>   
#include<locale.h>   
  
static char str1[210000], str2[210000];  
  
static long long int a[20000], b[20000], c[40010];  
  
const long long int judge = -2000000;  
  
void operate(long long int*, long long int*, long long int*, char);  
  
long long int* short_down(char*, long long int*);  
  
int main()  
{  
    char op;  
    long long int* p1, * p2;  
    while (1)  
    {  
        if (scanf("%s %c %s", str1, &op, str2) == EOF)  
        {  
            break;  
        }  
        getchar();  
  
  
  
        p1 = short_down(str1, a);  
  
        p2 = short_down(str2, b);  
  
        operate(p1, p2, c, op);  
  
    }  
}  
  
long long int* short_down(char* s, long long int* desti)  
{  
    char* p;  
    long long int* numb;  
    int count = 0;  
    p = s;  
    numb = desti;  
    *numb = 0;  
    while (1)  
    {  
        if (*p == '\0')  
        {  
            break;  
        }  
        p++;  
    }  
    p--;  
    while (1)  
    {  
        if (p < s)  
        {  
            *(numb + 1) = judge;  
            break;  
        }  
        if (count == 6)  
        {  
            numb++;  
            *numb = 0;  
            count = 0;  
        }  
        else  
        {  
            *numb = *numb + (*p - '0') * pow(10, count);  
            count++;  
            p--;  
        }  
    }  
    return desti;  
  
}  
  
void operate(long long int* num1, long long int* num2, long long int* desti, char oper)  
{  
    const long long int mod = 1000000;  
    long long int* num3;  
    long long int* p1, * p2,* p3;  
    long long int temp;  
    long long int i = 0;  
    long long int exad = 0;  
    int flag = 0, out = 0;  
    p1 = num1;  
    p2 = num2;  
    p3 = desti;  
    num3 = desti;  
    if (oper == '+')  
    {  
        while (1)  
        {  
            if (*num1 == judge && *num2 == judge)  
            {  
                if (exad != 0)  
                {  
                    *num3 = exad % mod;  
                    exad = exad / mod;  
                    num3++;  
                }  
                *num3 = judge;  
                break;  
            }  
            else if (*num1 == judge)  
            {  
                *num3 = (*num2 + exad) % mod;  
                exad = (*num2 + exad) / mod;  
                num3++;  
                num2++;  
            }  
            else if (*num2 == judge)  
            {  
                *num3 = (*num1 + exad) % mod;  
                exad = (*num1 + exad) / mod;  
                num3++;  
                num1++;  
            }  
            else if (*num1 != judge && *num2 != judge)  
            {  
                *num3 = (*num1 + *num2 + exad) % mod;  
                exad = (*num1 + *num2 + exad) / mod;  
                num3++;  
                num2++;  
                num1++;  
            }  
        }  
        while (1)  
        {  
            if (num3 < desti)  
            {  
                break;  
            }  
            if (*num3 != judge)  
            {  
  
                if (*(num3 + 1) == judge || out == 0)  
                {  
                    if (*num3 != 0)  
                    {  
                        printf("%lld", *num3);  
                        out = 1;  
                    }  
                    else if (num3 == desti)  
                    {  
                        printf("%lld", *num3);  
                    }  
  
                }  
                else if (*(num3 + 1) != judge)  
                {  
                    printf("%06lld", *num3);  
                }  
  
            }  
            num3--;  
        }  
        printf("\n");  
    }  
    else if (oper == '-')  
    {  
        while (1)  
        {  
            if (flag == 2)  
            {  
                break;  
            }  
            else if (flag == 1)  
            {  
                memset(desti, 0, sizeof(c));  
                num3 = desti;  
                while (1)  
                {  
                    if (*p1 == judge && *p2 == judge)  
                    {  
                        if (exad == -1)  
                        {  
                            *num3 = 1;  
                            flag = 1;  
                            exad = 0;  
                            num3++;  
                        }  
                        *num3 = judge;  
                        break;  
                    }  
                    else if (*p1 == judge)  
                    {  
                        if (*p2 + exad < 0)  
                        {  
                            *num3 = (*p2 + mod + exad) % mod;  
                            exad = -1;  
                        }  
                        else  
                        {  
                            *num3 = (*p2 + exad) % mod;  
                            exad = 0;  
                        }  
                        num3++;  
                        p2++;  
                    }  
                    else if (*p2 != judge && *p1 != judge)  
                    {  
                        if (*p2 + exad >= *p1)  
                        {  
                            *num3 = (*p2 + exad - *p1) % mod;  
                            exad = 0;  
                        }  
                        else if (*p2 + exad < *p1 && *(p2 + 1) != judge)  
                        {  
                            *num3 = (*p2 + mod - *p1 + exad) % mod;  
                            exad = -1;  
                        }  
  
                        num3++;  
                        p1++;  
                        p2++;  
                    }  
                }  
                flag = 2;  
                break;  
            }  
            else if (*num1 == judge && *num2 == judge)  
            {  
                if (exad == -1)  
                {  
                    *num3 = 1;  
                    flag = 1;  
                    exad = 0;  
                    num3++;  
                }  
                *num3 = judge;  
                break;  
            }  
            else if (*num1 == judge)  
            {  
                flag = 1;  
            }  
            else if (*num2 == judge)  
            {  
                if (*num1 + exad < 0)  
                {  
                    *num3 = (*num1 + mod + exad) % mod;  
                    exad = -1;  
                }  
                else  
                {  
                    *num3 = (*num1 + exad) % mod;  
                    exad = 0;  
                }  
                num3++;  
                num1++;  
            }  
            else if (*num1 != judge && *num2 != judge)  
            {  
                if (*num1 + exad >= *num2)  
                {  
                    *num3 = (*num1 + exad - *num2) % mod;  
                    exad = 0;  
                }  
                else if (*num1 + exad < *num2 && *(num1 + 1) != judge)  
                {  
                    *num3 = (*num1 + mod - *num2 + exad) % mod;  
                    exad = -1;  
                }  
                else if (*num1 + exad < *num2 && *(num1 + 1) == judge)  
                {  
                    *num3 = (*num2 - *num1 - exad) % mod;  
                    exad = -((*num2 - *num1 - exad) / mod);  
                    flag = 1;  
                }  
  
                num3++;  
                num2++;  
                num1++;  
            }  
        }  
        while (1)  
        {  
            if (num3 < desti)  
            {  
                break;  
            }  
            if (flag == 1 || flag == 2)  
            {  
                printf("%c", '-');  
                flag = 0;  
            }  
            if (*num3 != judge)  
            {  
                if (*(num3 + 1) == judge || out == 0)  
                {  
                    if (*num3 != 0)  
                    {  
                        printf("%lld", *num3);  
                        out = 1;  
                    }  
                    else if (num3 == desti)  
                    {  
                        printf("%lld", *num3);  
                    }  
                }  
                else if (*(num3 + 1) != judge)  
                {  
                    printf("%06lld", *num3);  
                }  
  
            }  
            num3--;  
        }  
        printf("\n");  
    }  
    else if (oper == '*')  
    {  
        memset(desti, 0, sizeof(c));  
        while (1)  
        {  
            if (*num2 == judge)  
            {  
                num3=p3;  
                *num3 = judge;  
                break;  
            }  
            else if (*num1 == judge)  
            {  
                num1 = p1;  
                num2++;  
                i++;  
                p3 = num3;  
                num3 = desti + i;  
            }  
            else if (*num1 != judge)  
            {  
                *num3 = *num3 + (*num1) * (*num2);  
                num1++;  
                num3++;  
            }  
        }  
        exad = 0;  
        num3 = desti;  
        while (1)  
        {  
            if (*num3 == judge)  
            {  
                while (1)  
                {  
                    if (exad == 0) break;  
                    *num3 = exad % mod;  
                    exad =  exad / mod;  
                    num3++;  
                    *num3 = judge;  
                }  
                break;  
            }  
            else  
            {  
                temp = *num3;  
                *num3 = (*num3 + exad) % mod;  
                exad = (temp+exad) / mod;  
                num3++;  
            }  
        }  
  
  
        while (1)  
        {  
            if (num3 < desti)  
            {  
                break;  
            }  
            if (*num3 != judge)  
            {  
                if (*(num3 + 1) == judge || out == 0)  
                {  
                    if (*num3 != 0)  
                    {  
                        printf("%lld", *num3);  
                        out = 1;  
                    }  
                    else if (num3 == desti)  
                    {  
                        printf("%lld", *num3);  
                    }  
                }  
                else if (*(num3 + 1) != judge)  
                {  
                    printf("%06lld", *num3);  
                }  
            }  
            num3--;  
        }  
        printf("\n");  
  
    }  
}  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值