微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

下面是自己这几天做大数题目的总结  当中有错的不足的地方还望指出来   持续修改中。。。   文章末尾有代码

听说有些大数题目可以利用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)去掉前导零
(乘法不去前导零的时候我感觉非常的蛋疼 因为不知道怎么保留啊  其实,到时候看具体情况修改一下就行了 也不难写   我下面写的代码是保存输入最多位数的前导零   
比如
     1111111111111100

*  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]='\0';
}

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]='\0';
    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 = %d\n",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]='\0';
    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");
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐