P6051 [RC-02] 求和 題解
阿新 • • 發佈:2021-12-23
P6051 [RC-02] 求和 題解
型別)。
然後從第一個字元的下標開始,線上尋找是否有數字和負號。這時坑點就來了。 這個變數來記錄數字個數。所以,如果是這樣的話,那麼字串裡沒有數字,自然就意味著\(\texttt{cnt}\)這個變數等於0,就不用輸出了,否則輸出總和。
Content
輸入一行字串\(s\),提取出\(s\)中的所有數字(如果負號前後都有數字的話不算做負號而是間隔符)並輸出它們的和。
資料範圍:設第\(i\)行字串中數字個數為\(cnt_i\),每個數字為\(num_{i,j}(j\in[1,cnt_i])\)。則\(|s|\leqslant1000,cnt_i\leqslant200,|num_{i,j}|\leqslant10^7,1\leqslant i\leqslant100\)。
Solution
字串模擬題。
廢話不說,我們來理一下思路:
首先,讀入一行字串。這裡建議用\(\texttt{gets}\)讀入一個字元陣列(\(\texttt{char}\)
然後從第一個字元的下標開始,線上尋找是否有數字和負號。這時坑點就來了。
坑點1:如果負號前後都有數字,不算做後面數字的負號而是一個沒用的間隔符。
判斷完之後就開始記錄數字了。這裡和快讀有些類似,設\(x=0,f=1\),其中\(x\)就是記錄數字的,\(f\)就是判斷正負的,這個大家應該都清楚。如果數字前面是負號(前提是判斷完後是非間隔符),那麼一開始\(f\)就是\(-1\)。然後往後推數字,並計入\(x\)中。最後總和直接加上\(x\times y\)就可以了。
這時又有坑點出現了:
坑點2:如果沒有數字,什麼都不要輸出。
以下的程式碼中用的是一個\(\texttt{num}\)陣列儲存數字,並用\(\texttt{cnt}\)
細節有點多,細細琢磨。
Code
#include <cstdio> #include <string> #include <cstring> #include <cmath> #include <iostream> using namespace std; char a[1007]; int main() { while(gets(a)) { int num[207] = {0}, sum = 0, n = strlen(a), cur = 0, cnt = 0; while(cur < n) { // printf("%c ", a[cur]); if((a[cur] >= '0' && a[cur] <= '9') || (a[cur] == '-' && (a[cur + 1] >= '0' && a[cur + 1] <= '9') && (a[cur - 1] < '0' || a[cur - 1] > '9'))) { int x = 0, f = 1; if(a[cur] == '-') {f = -1; cur++;} while(a[cur] >= '0' && a[cur] <= '9') { x = x * 10 + (a[cur] - '0'); cur++; // printf("%d\n", x); } num[++cnt] = x * f; // printf("%d %d\n\n", num[cnt], cnt); } else cur++; } if(!cnt) continue; for(int i = 1; i <= cnt; ++i) sum += num[i]; printf("%d\n", sum); } return 0; }