1. 程式人生 > >HDU1753 大明A+B【大數】

HDU1753 大明A+B【大數】

大明A+B

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 14058    Accepted Submission(s): 5147


Problem Description 話說,經過了漫長的一個多月,小明已經成長了許多,所以他改了一個名字叫“大明”。
這時他已經不是那個只會做100以內加法的那個“小明”了,現在他甚至會任意長度的正小數的加法。

現在,給你兩個正的小數A和B,你的任務是代表大明計算出A+B的值。

Input 本題目包含多組測試資料,請處理到檔案結束。
每一組測試資料在一行裡面包含兩個長度不大於400的正小數A和B。
Output 請在一行裡面輸出輸出A+B的值,請輸出最簡形式。詳細要求請見Sample Output。

Sample Input 1.1 2.9 1.1111111111 2.3444323343 1 1.1
Sample Output 4 3.4555434454 2.1
Author linle
Source

問題簡述

:參見上文。

問題分析

  兩個數可以能非常長,帶有小數點,所以相加的話要麼直接相加,要麼轉換為大數。大數的話,因為有小數點,就不那麼好算了。所以還是直接相加。

程式說明

直接相加也有兩種計算方法,一種是把兩個數讀到字串陣列中,然後對齊小數點並且補0,再行相加;另外一種方法(本程式使用的方法)是直接計算位置,進行相加。

  讀入資料時也有兩種方法,一是用函式scanf()讀入資料(字串);二是使用函式getchar()讀入資料(逐個字元讀入)。由於進行相加時,需要計算小數點前後的位數,後一種可以一邊讀入資料一邊計算。本程式採用後一種做法,邏輯上稍微複雜一些,需要更高的技巧。

  程式中,需要注意兩點:

  1.計算結果的整數部分左邊有可能有很多0;

  2.輸入的最後一行,有可能沒有換行("\n")檔案就直接結束了,需要做特殊處理。

AC的C語言程式如下:

/* HDU1753 大明A+B */

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

#define MAXN 400

char a[MAXN+1], b[MAXN+1], ans[MAXN+1];

int main(void)
{
    char c;
    int aleftcount, arightcount, bleftcount, brightcount, carry, count, i, j, k, l;

    for(;;) {
        c=getchar();
        if(c == EOF)
            break;

        // step1 讀入A
        i = 0;
        aleftcount = 0;
        arightcount = 0;
        // setp1.1 讀入A的小數點前的各位,並且位數計數
        while(c != '.' && c != ' ') {
            a[i++] = c;
            aleftcount++;
            c=getchar();
        }
        a[i++] = c; // 小數點或空格
        // step1.2 讀入A的小數點後的各位,並且位數計數
        if(c != ' ')
            while((c=getchar()) != ' ') {
                a[i++] = c;
                arightcount++;
            }
        k = i - 1;

        // step2 讀入B
        i = 0;
        bleftcount = 0;
        brightcount = 0;
        // setp2.1 讀入B的小數點前的各位,並且位數計數
        while((c=getchar()) != '.' && c != '\n') {
            b[i++] = c;
            bleftcount++;
        }
        b[i++] = c; // 小數點或換行符
        // step2.2 讀入B的小數點後的各位,並且位數計數
        if(c != '\n' && c != EOF)
            while((c=getchar()) != '\n' && c != EOF) {
                b[i++] = c;
                brightcount++;
            }
        l = i - 1;

        // step3 計算A+B
        // step3.1 小數部分相加
        j = 0;
        // step3.1.1 拷貝長的部分
        if(arightcount > brightcount) {
            count = arightcount - brightcount;
            while(count--)
                ans[j++] = a[k--];
        } else if(arightcount < brightcount) {
            count = brightcount - arightcount;
            while(count--)
                ans[j++] = b[l--];
        }
        // step3.1.2 同長部分相加
        carry = 0;
        count = (arightcount > brightcount) ? brightcount : arightcount;
        for(i=1; i<=count; i++) {
            ans[j] = carry + a[k] + b[l] - '0';
            if(ans[j] > '9') {
                ans[j] -= 10;
                carry = 1;
            } else
                carry = 0;
            j++;
            k--;
            l--;
        }
        // step3.2 小數點
        ans[j++] = '.';
        // step3.3 整數部分相加
        k--;
        l--;
        while(k >= 0 || l >= 0) {
            ans[j] = carry + ((k>=0) ? a[k] : '0') + ((l>=0) ? b[l] : '0') - '0';
            if(ans[j] > '9') {
                ans[j] -= 10;
                carry = 1;
            } else
                carry = 0;
            j++;
            k--;
            l--;
        }
        if(carry == 1)
            ans[j++] = '1';

        // step4 輸出結果
        // step4.1 去掉右邊的0和小數點
        k = 0;
        while(ans[k] == '0')
            k++;
        if(ans[k] == '.')
            k++;
        // step4.2 輸出結果
        for(i=j-1; i>=k; i--)
            putchar(ans[i]);
        putchar('\n');
    }

    return 0;
}


相關推薦

HDU1753 大明A+B大數

大明A+B Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 14058    Accepted Submiss

HDU-1753 大明A+B大數相加

解題思路: 大數相加問題,但是有三種情況:2個整數,1個整數1個小數,2個小數。 這就需要我們單獨處理每種情況,而且這道題需要保證沒有多餘的前導0和後導0,剛開始想到簡單了。結果到最後搞了150行才過。悲劇。 這道題的巧妙做法是:把每種情況都轉換成2個小數來搞,這樣就只

51nod_1005 大數加法/HDU1753 大明A+B/poj1001(大數的加法/減法/乘法)

先系統的講講大數加法減法乘法的統一套路: 先貼程式碼: 大數加法: void BigAdd(char *adda,int lena,char *addb,int lenb,char sum[]){ int i,j,lensum; lensum=lena>len

大數a+b大數

I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B.InputThe first line of the inp

hdu1753大明A+B(高精度)

#include <iostream> #include <string> #include <cstring> using namespace std; const int MAXN = 500; int pre[MAXN],pos[MAXN],num1[MAXN],nu

HPU 1002 A + B Problem II大數

lar 保存 memory positive test size mod ack auth A + B Problem II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/327

HDU1002 A + B Problem II大數

A + B Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission

hdoj_1002A+B Problem ||(大數)

題目提示,相加的兩個數的位數可能很大(最多可達1000位),而int最多32位,long long型別和__int64型別都是最多64位,均不能儲存位數過多的數,所以現有的資料型別無法直接儲存.

HDU2033 人見人愛A+B進位制

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 49289    Accepted Submission(s

hdu-1753-大明A+B(大數問題)

大明A+B Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 9337    Accepted Submission

HDU 1753 大明A+B(大數相加)(string::npos)

話說,經過了漫長的一個多月,小明已經成長了許多,所以他改了一個名字叫“大明”。 這時他已經不是那個只會做100以內加法的那個“小明”了,現在他甚至會任意長度的正小數的加法。 現在,給你兩個正的小數A和B,你的任務是代表大明計算出A+B的值。 Inpu

ACM-簡單題之大明A+B——hdu1753

大明A+B Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7220 Accepted Submission(s):

hdu 1753 大明A+B 大數加減

#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; char a[404],

HDU 1753 大明A+B (大數加法)

#include <iostream> #include <string> using namespace std; int findpoint(string str) //找到小數點在字串中的位置 { int i; f

矩陣 A+B水題

在數學中,矩陣是一個按照長方陣列排列的複數或實數集合,最早來自於方程組的係數及常數所構成的方陣。這一概念由19世紀英國數學家凱利首先提出。 矩陣是高等代數學中的常見工具,也常見於統計分析等應用數學學科中。在物理學中,矩陣於電路學、力學、光學和量子物理中都有應用;電腦科學中,三維動畫製作也需要用到矩陣。 矩陣

HD-ACM算法專攻系列(10)——大明A+B

next() http pla 分享 rgs pub system println sca 題目描述: 源碼: 需要註意的一點是輸出是最簡形式,需要去除小數的後導0,而調用stripTrailingZeros()函數後,數會以科學計數法輸出,所以需要調用toPlainS

HDU 1753 大明A+B

printf space bsp ++ pre 題解 clu sub pri 大明A+B Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub

345. Reverse Vowels of a Stringeasy

not blog ive 參考 char wap ast otc emp 345. Reverse Vowels of a String【easy】 Write a function that takes a string as input and reverse o

2017廣工新生賽決賽 B 模擬

spa 通過 turn 描述 namespace 定義 name 內部 但是 Problem B: 狗哥的肚子 Time Limit: 1 Sec Memory Limit: 128 MB Description【http://gdutcode.sinaapp.c

HDU1203 I NEED A OFFER! 貪心

tis -m mem 概率 全部 itl ++ tput amp I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 6553