| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5598 人关注过本帖
标题:Devil_W, 哥给你写的 BigFloat
取消只看楼主 加入收藏
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
结帖率:94.72%
收藏
已结贴  问题点数:20 回复次数:8 
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
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
回复 11楼 zisefengye
我觉得小题目也是有讨论的价值的, 很多知识本身就是简单的东西。
不过 谭浩强的书 毒害了多少同学啊, 写出来几行代码都惨不忍睹,
恶心到不行,/不好讨论呀,

我就是真命天子,顺我者生,逆我者死!
2010-07-21 21:28
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
回复 8楼 iFreeBSD
你建议很好呀,
临时写的,直接复制一下,图个方便。

我就是真命天子,顺我者生,逆我者死!
2010-07-21 21:33
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
回复 13楼 Devil_W
好啊, 写出来让我们大家好好学学啊

我就是真命天子,顺我者生,逆我者死!
2010-07-21 21:34
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
回复 13楼 Devil_W
最后一句我看的就不爽了, 记得我说过你是 "慕容复" 吗?

我就是真命天子,顺我者生,逆我者死!
2010-07-21 21:37
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
你牛个什么呀,路边的一个卖白菜的小贩都混的比你好,有啥好装B的,

我就是真命天子,顺我者生,逆我者死!
2010-07-21 21:40
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
其实你这几行代码,跟老谭的比下
还是老谭的代码更加优雅点。

他的书中你随便挑一个题目, 我要是写的没他漂亮, 现在辞职回家种田。
别TM喝着三鹿奶粉,还心存感激。

我就是真命天子,顺我者生,逆我者死!
2010-07-21 21:51
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
你这种人,就是太缺乏想象力了。明明什么都不懂,还整天装。

你说我什么都不懂就什么都不懂啊, 我需要向你证明吗,哥做的项目可以提前一个月完成。
你TM的是不是整的太慢被 趋势开了? 到论坛里面找安慰?

我就是真命天子,顺我者生,逆我者死!
2010-07-21 22:00
快速回复:Devil_W, 哥给你写的 BigFloat
数据加载中...
 
   



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

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