• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            付翔的專欄
            在鄙視中成長 記錄成長的點滴
            posts - 106,  comments - 32,  trackbacks - 0
              

            小數的精度的加法 很自然的和整數的加法連在一起 于是 就把小數點隔開,分成兩部分加 。。只是在小數部分加的時候 進位 細節處理不當導致很多錯誤 也算是一次教訓吧 。。。
            因為 中途修改過很多 代碼看起來 有點亂 呵呵
             

            #include
            <stdio.h>
            #include
            <string.h>
            #include
            <stdlib.h>

            void partition_string(char _a[],char _a1[],char _a2[])
            {
                
            char *str;
                
            int i,j,len;
                str 
            = strchr(_a,'.');// 
                if(str!=NULL)
                {
                    len 
            = strlen(_a);//len = strlen(str);//這是錯誤的源泉 對于 1.1234567  這個是得到 .1234567的長度 
                    strncpy(_a1,_a,(str-_a)/sizeof(char));
                    _a1[(str
            -_a)/sizeof(char)] = '\0';
                    
                    
            for(j = 0, i = (str-_a)/sizeof(char+ 1;i< len;i++,j++)
                        _a2[j] 
            = _a[i];
                    _a2[j] 
            = '\0';
                }
                
            else 
                {
                    strcpy(_a1,_a);
                    strcpy(_a2,
            "");
                }

            }
            void supply(char _a[],int len)//對于小數區不足的以0補足 
            {
                
            int count = strlen(_a),i;
                
            for(i = count ; i < len;i++)//for(i = count ; count < len;i++) 單步調試 才測出這個錯誤
                    _a[i] = '0';
                _a[i] 
            = '\0';
            }
            int check(char _str[])//這里貌似沒有把0 去掉 而是換成了 空字符 for(k = i;k < len;k++) 
            {    
                
            /*12121213213124342545354545 13312312321312321321.02300000000000000000000000000
                這個測試數據 0.023 0000  后面的0 也會打印出來 因為for(k = i;k < len;k++) 這個我沒有加 str[i]!='\0'
            */
                
            int i,len = strlen(_str);
                
            for(i = len-1;i>=0;i--)
                {
                    
            if(_str[i] == '0') _str[i] = '\0';
                    
            else return i;
                    
            //if(_str[i] != '0' ) break;
                }
                
            //_str[i+1] = '\0'; 
                
            //if(i == 0) return 0;
                return -1;
            }
            void add(char a[],char b[],char back[])//大數 加
            {
                
            int i,j,k,up,x,y,z,l;
                
            char *c;
                
            if (strlen(a)>strlen(b)) l=strlen(a)+2else l=strlen(b)+2;
                c
            =(char *) malloc(l*sizeof(char));
                i
            =strlen(a)-1;
                j
            =strlen(b)-1;
                k
            =0;up=0;
                
            while(i>=0||j>=0)
                {
                    
            if(i<0) x='0'else x=a[i];
                    
            if(j<0) y='0'else y=b[j];
                    z
            =x-'0'+y-'0';
                    
            if(up) z+=1;
                    
            if(z>9) {up=1;z%=10;} else up=0;
                    c[k
            ++]=z+'0';
                    i
            --;j--;
                }
                
            if(up) c[k++]='1';
                i
            =0;
                c[k]
            ='\0';
                
            for(k-=1;k>=0;k--)
                    back[i
            ++]=c[k];
                back[i]
            ='\0';


            int main()
            {
                
            //freopen("in.txt","r",stdin);
                char a[500],b[500],temp[10];
                
            char sum1[500],sum2[500];
                
            char a1[500],a2[500],b1[500],b2[500];
                
            char *str,*str2;int len,lena,lenb,i,j,k,l,num;
                
            while(scanf("%s%s",a,b)!=EOF)
                {
                    memset(a1,NULL,
            500);memset(a2,NULL,500);//這個其實可以去掉
                    memset(b1,NULL,
            500);memset(b2,NULL,500);
                    partition_string(a,a1,a2);partition_string(b,b1,b2);
                    lena 
            = strlen(a2);lenb=strlen(b2);
                    len 
            = lena>lenb?lena:lenb;
                    
            if(lena < lenb)
                        supply(a2,len);
                    
            else if(lena > lenb)
                        supply(b2,len);
                    add(a2,b2,sum2);
                    add(a1,b1,sum1);

                    i 
            = 0;
                    
            if( len < strlen(sum2) )
                        i 
            = 1,num = sum2[0]-'0';
                    
            if(i == 1)
                    {
                        
            /*k = sum1[strlen(sum1)-1] - '0';//這里的進位考慮不周到
                        sum1[strlen(sum1)-1] = (k+num)%10 + '0';
                        if(k + num > 9)
                            sum1[strlen(sum1)-2]+=1;
            */
                        
            for(j = strlen(sum1)-1; j>=0 ;j--//考慮 xxx99999 進位的情況
                        {
                            k 
            = sum1[j] - '0';
                            
            if(k + num > 9) {sum1[j] =  (k+num)%10 + '0'; num = 1;}
                            
            else {sum1[j] = k + num + '0';break;}
                        }
                        
            if(j == -1)//如果 出現 整數是99999 然后進了一位 這樣的情況
                            printf("1");
                    }
                    printf(
            "%s",sum1);
                    
            if(check(sum2) > 0 ||(check(sum2) == 0 && i!=1))  printf(".");
                    len 
            = strlen(sum2);
                    
            for(k = i;k < len && sum2[k]!='\0';k++)
                        printf(
            "%c",sum2[k]);
                    printf(
            "\n");
                    memset(a,NULL,
            500);memset(b,NULL,500);

                }
                
            return 0;
            }


            posted on 2010-04-24 13:35 付翔 閱讀(1486) 評論(0)  編輯 收藏 引用 所屬分類: ACM 數據結構

            <2011年3月>
            272812345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            常用鏈接

            留言簿(2)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            CSDN - 我的blog地址

            博客

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            国产精品无码久久久久| 久久精品九九亚洲精品| 久久伊人五月天论坛| 亚洲精品乱码久久久久久蜜桃| 亚洲va中文字幕无码久久| 亚洲狠狠久久综合一区77777| 日韩久久无码免费毛片软件| 奇米影视7777久久精品| 91久久精品电影| 国内精品九九久久久精品| 久久婷婷人人澡人人| 久久成人精品视频| 国产69精品久久久久久人妻精品| 久久香蕉一级毛片| 久久99精品久久久大学生| 久久五月精品中文字幕| 亚洲乱亚洲乱淫久久| 久久亚洲精品成人av无码网站| 久久av高潮av无码av喷吹| 国产精品视频久久久| 久久久久亚洲AV无码专区首JN | 久久久精品久久久久特色影视| 亚洲国产精品无码久久| 欧美精品丝袜久久久中文字幕| 久久国产精品99精品国产987| 久久综合给久久狠狠97色| 久久久亚洲欧洲日产国码是AV| 亚洲欧美国产精品专区久久| 久久国产三级无码一区二区| 精品久久久久久久久久中文字幕 | 国产精品美女久久久久久2018| 一本综合久久国产二区| 欧美久久综合九色综合| 国产视频久久| 午夜精品久久久内射近拍高清| 久久精品无码av| 久久只有这精品99| 精产国品久久一二三产区区别| 国内精品久久久久久久久电影网| 漂亮人妻被中出中文字幕久久| 精品久久久一二三区|