| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5598 人关注过本帖
标题:Devil_W, 哥给你写的 BigFloat
只看楼主 加入收藏
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
结帖率:94.72%
收藏
已结贴  问题点数:20 回复次数:55 
Devil_W, 哥给你写的 BigFloat
#include <stdio.h>
#include <string.h>
#define MAX_LEN 150
unsigned an1[MAX_LEN];
unsigned an2[MAX_LEN];
unsigned aResult[2*MAX_LEN];
char szBase1[MAX_LEN];
char szBase2[MAX_LEN];
int len1,len2;
void bgMultiply(void)
{
    int i, j;
    //每一轮都用an1的一位,去和an2各位相乘,从an1的个位开始
    for( i = 0;i < len2; i ++ )
    {     
        //用选定的an1的那一位,去乘an2的各位
        for( j = 0; j < len1; j ++ )     
            //两数第i, j位相乘,累加到结果的第i+j位
            aResult[i+j] += an2[i]*an1[j];   
    }
    //下面的循环统一处理进位问题
    for( i = 0; i < MAX_LEN-1; i ++ )
    {
        if( aResult[i] >= 10 )
        {
            aResult[i+1] += aResult[i] / 10;
            aResult[i] %= 10;
        }
    }
}
int main(void)
{
    FILE* fp;
    int i,j,basePointPos1,baseDecimalDigits1,basePointPos2,baseDecimalDigits2,resultPointPos,resultEndPos,resultBeginPos;
    char* p;

    while(scanf("%s%s",szBase1, szBase2)>0)
    {
        basePointPos1 = -1;
        baseDecimalDigits1 = 0;
        basePointPos2 = -1;
        baseDecimalDigits2 = 0;
        memset( an1, 0, sizeof(an1));
        memset( an2, 0, sizeof(an2));
        memset( aResult, 0, sizeof(aResult));
        len1 = strlen(szBase1);
        //根据小数点位置和末尾0的出现来计算小数位数,同时计算排除末尾0的长度
        p = strchr(szBase1,'.');
        if(p)
        {
            basePointPos1 = p-szBase1;
            for( i = len1 - 1; szBase1[i]=='0' && i>basePointPos1; i--)
                continue;
            baseDecimalDigits1 = i-basePointPos1;
            len1 = i+1;
        }
        j = 0;
        for( i = len1 - 1;i >= 0 ; i--)
        {
            if(i==basePointPos1)
                continue;
            an1[j] = szBase1[i] - '0';
            j++;
        }
        len2 = strlen(szBase2);
        //根据小数点位置和末尾0的出现来计算小数位数,同时计算排除末尾0后的长度
        p = strchr(szBase2,'.');
        if(p)
        {
            basePointPos2 = p-szBase2;
            for( i = len2 - 1; szBase2[i]=='0' && i>basePointPos2; i--)
                continue;
            baseDecimalDigits2 = i-basePointPos2;
            len2 = i+1;
        }
        j = 0;
        for( i = len2 - 1;i >= 0 ; i--)
        {
            if(i==basePointPos2)
                continue;
            an2[j] = szBase2[i] - '0';
            j++;
        }
        
        bgMultiply();
        //计算结果中小数点应出现的位置
        resultPointPos = baseDecimalDigits1 + baseDecimalDigits2 - 1;
        
        
        //计算结果的最后一位在数组中的位置
        resultEndPos = 0;
        
        for( i = 0; aResult[i]==0 && i<resultPointPos; i++ )
            continue;
        resultEndPos = i;
        
        //计算结果的最高位在数组中的位置
        for( i = MAX_LEN-1; aResult[i]==0 && i>=0; i-- )
            continue;
        if(resultPointPos>i)
            resultBeginPos = resultPointPos;
        else
            resultBeginPos = i;
        
        fp = fopen("blue.txt", "ab");
        
        for( i = resultBeginPos; i>=resultEndPos ; i-- )
        {
            if (resultBeginPos ==  resultEndPos)
            {
                printf("0");
                fprintf(fp,"%d", 0);
            }
            if ( i == resultPointPos )
            {
                printf(".");
                fprintf(fp,"%c", '.');
            }
            fprintf(fp,"%d", aResult[i]);
            printf("%d", aResult[i]);
        }
        fprintf(fp,"%s", "\r\n");
        fclose(fp);
        printf("\n");
    }
    return 0;
}
样例输入
11.2233445566778899 99.8877665544332211
1122.33445566778899 9988.77665544332211
112233.445566778899 998877.665544332211
11223344.5566778899 9988776655.44332211
1122334455.66778899 998877665544.332211
112233445566.778899 99887766554433.2211

样例输出
1121.07482103740987777903741240815689
11210748.2103740987777903741240815689
112107482103.740987777903741240815689
112107482103740987.777903741240815689
1121074821037409877779.03741240815689
11210748210374098777790374.1240815689


[ 本帖最后由 BlueGuy 于 2010-7-20 22:28 编辑 ]
收到的鲜花
  • sunyh19992010-07-21 10:25 送鲜花  10朵   附言:好文章
搜索更多相关主题的帖子: BigFloat 
2010-07-20 22:07
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
不要喷我啊,哈哈。/

我就是真命天子,顺我者生,逆我者死!
2010-07-20 22:15
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
收藏
得分:1 
哦买噶

我可好玩啦...不信你玩玩^_^
2010-07-20 23:13
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:1 
口水战要开始了???mark````
2010-07-20 23:48
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:1 
我早就说过,你有多少货,我心里明白,你自己心里也很明白。

还能别那么幼稚,自己故意掉价自己。

好歹你也是菜鸟集中营营长。
2010-07-21 00:24
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:1 
哦?! pgy 的头像这么漂亮,是不是本人呀?
    (其实我的目的和 4 楼一样~)
2010-07-21 02:01
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:1 
回复 6楼 pangding
很明显的就不是他嘛,好象是个明星,PGY 哪有这么漂亮啊.
2010-07-21 11:29
iFreeBSD
Rank: 4
等 级:业余侠客
威 望:4
帖 子:474
专家分:236
注 册:2007-11-5
收藏
得分:1 
我也来冒个泡。
建议BlueGuy直接定义有理数数据结构,并把数据结构ADT都实现了,这样你维护代码也方便,我觉得你main函数过长了。

without further ado, let’s get started
2010-07-21 11:51
iFreeBSD
Rank: 4
等 级:业余侠客
威 望:4
帖 子:474
专家分:236
注 册:2007-11-5
收藏
得分:0 
以下是引用广陵绝唱在2010-7-21 11:29:35的发言:

很明显的就不是他嘛,好象是个明星,PGY 哪有这么漂亮啊.


话不要说的太绝了。“好像是明星”。

without further ado, let’s get started
2010-07-21 11:53
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
以下是引用iFreeBSD在2010-7-21 11:53:02的发言:

 
 
话不要说的太绝了。“好像是明星”。

这么说话才有 广陵 的感觉~~
2010-07-21 12:09
快速回复:Devil_W, 哥给你写的 BigFloat
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018650 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved