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_1002】A+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 String【easy】
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