加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

大数的四则运算 与浮点数的优势

发布时间:2020-12-14 04:03:14 所属栏目:大数据 来源:网络整理
导读:下面是自己这几天做大数题目的总结 ?当中有错的不足的地方还望指出来 ? 持续修改中。。。 ? 文章末尾有代码 听说有些大数题目可以利用double的优势解决(当然测试数据弱了) ?很牛是吧 ?我也感觉很牛 ?别问我 ?我现在也不知道 ?我正在学呢。。。 大数的四则
下面是自己这几天做大数题目的总结 ?当中有错的不足的地方还望指出来 ? 持续修改中。。。 ? 文章末尾有代码

听说有些大数题目可以利用double的优势解决(当然测试数据弱了) ?很牛是吧 ?我也感觉很牛 ?别问我 ?我现在也不知道 ?我正在学呢。。。


大数的四则运算
整数
浮点数
(浮点数类似整数的运算 我的做法记录小数点的位置 同样的把数字逆序存储后计算 这样就可以知道到时候小数点应该出现在结果的什么位置了)

大数正整数的四则运算步骤
1:加法:
(1)逆序存储输入的数据
(2)调用Count(char *a,cahr *b,char *str)函数 ?进行加法计算 ?返回计算结果字符串
(3)调用print()输出函数 ?根据要求判断是否要输出前导零 ?适当的修改输出函数 ? ?

2:乘法:
(1)逆序存储输入的数据 ?
(2)调用multi(char *a,char *b,char *str)函数 ?进行乘法计算 ?返回计算结果字符串
(3)调用print()输出函数 ?根据要求判断是否要输出前导零 ?适当的修改输出函数

3:减法:待更新。。

4:除法:待更新。。


注意:
1:输入数据太大的话模拟四则运算的方法会超时(目前没有找到解决方法 ?找到了再更新)


2:大数的大小比较:
(1)去掉前导零
(2)长度比较 ?长度小的自然就小 ? 长度相等从最高位开始比较
??
3:输入与输出:
输入:可以有前导0
输出:
(1)保留前导零
(2)去掉前导零
(乘法不去前导零的时候我感觉非常的蛋疼 因为不知道怎么保留啊 ?其实,到时候看具体情况修改一下就行了 也不难写 ? 我下面写的代码是保存输入最多位数的前导零 ??
比如
? ?? 2222222222111100

* ?000000000000

= 0000000000000000

所以说这很蛋疼啊!)
4:要是结果是零且要去掉前导零的时候千万要输出0啊 ?别什么都没输出

5: 待更新。。


#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;

void print(char *str,int str_len)
{
    int i = str_len-1,ok = 1;
    //for(i = str_len-1; str[i] == '0'; i--);//加上这条输出时去掉前导零  实际的str字符串并没有改变
    for( ;i >= 0; i--)
    {
        printf("%c",str[i]);
        ok = 0;
    }
    if(ok&&i == -1)printf("0");
    printf("n");
}


int  zero(char *l)//返回前导零的个数注意 字符串是顺序存储的
{
    int i;
    for(i = 0; l[i]=='0' ;i++);
    return i;
}

/*返回1:q比p大 返回0:p比q大*/
int Compare(char *q,char *p)//这的数一定要是顺序存储的
{
    int q_zero = zero(q);
    int q_len = strlen(q);
    int p_zero = zero(p);
    int p_len = strlen(p);
    if(q_len-q_zero > p_len - p_zero)return 1;
    if(p_len - p_zero > q_len- q_zero)return 0;
    //长度相等比较每位数
    for(; q_zero < q_len; q_zero++,p_zero++)
        if(p[p_zero]<q[q_zero])return 1;
        else if(p[p_zero]>q[q_zero])return 0;
    return 0;
}

void  re_order(char *p,int p_len,char *q)//逆序存储p到q中
{
    int q_len = 0;
    for(int i = p_len-1; i >= 0; i--)
        q[q_len++]=p[i];
        q[q_len]='';
}

void Count(char *a,char *b,char *str)
{
    int a_len = strlen(a);
    int b_len = strlen(b);
    int i,sum = 0;
    int str_len = 0;
    if(a_len == b_len)
        for(i = 0; i < a_len; i++ )
        {
            sum += a[i]-'0'+b[i]-'0';
            str[str_len++] = sum%10+'0';
            sum /= 10;
        }
    else if(a_len > b_len)
    {
        for(i = 0; i < b_len; i++ )
        {
            sum += a[i]-'0'+b[i]-'0';
            str[str_len++] = sum%10+'0';
            sum /= 10;
        }
        for(;i < a_len; i++)
        {
            sum += (a[i]-'0');
            str[str_len++] = sum%10+'0';
            sum /= 10;
        }
    }
    else
    {
        for(i = 0; i < a_len; i++ )
        {
            sum += a[i]-'0'+b[i]-'0';
            str[str_len++] = sum%10+'0';
            sum =sum / 10;
        }
        for(;i < b_len; i++)
        {
            sum += b[i]-'0';
            str[str_len++] = sum%10+'0';
            sum /= 10;
        }
    }
    if(sum>0)
        str[str_len++] = sum+'0';
    str[str_len]='';
    print(str,str_len);
}

void  multi(char *a,char *str)
{
    int a_len = strlen(a);
    int b_len = strlen(b);
    int  num[1005];
    memset(num,sizeof(num));//这一定要初始化为零  要不容易Wrong的
    int i,j,num_len,str_len,sum;
    num_len = sum = 0;
    for(i = 0; i < a_len; i++)
        for(j = 0; j < b_len; j++)
            num[i+j] += (a[i]-'0')*(b[j]-'0');//最多有a_len+b_len 位
    for(str_len = 0; str_len < a_len+b_len; str_len++)
    {
        sum += num[str_len];
        str[str_len] = sum%10+'0';
        sum /= 10;
    }
    //下面的操作是在计算的结果中保存最多的前导零
    int maxn = max(a_len,b_len);
    printf("maxn=%d str_len = %dn",maxn,str_len);
    for( ; str[str_len-1] == '0'; str_len--);
    if(str_len < maxn)
        for(;str_len < maxn; str_len++)str[str_len] = '0';
    str[str_len]='';
    print(str,str_len);
}

int main()
{
    #ifdef LOCAL
    freopen("in1.txt","r",stdin);
    #endif // LOCAL
    char q[1005],p[1005],n[1005],m[1005];
    char str[1005];//用来保存计算的结果
    while(gets(q)!=NULL)
    {
        gets(p);
        puts(q);
        puts(p);
        int q_len = strlen(q),p_len = strlen(p);
        re_order(q,q_len,m);
        re_order(p,p_len,n);
        //Count(m,n,str);
        multi(m,str);
        printf("n");
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读