內容
給定一陣列 A,請輸出這個陣列的前綴和陣列 B。
定義 : 當 B[i]為 A[0]+A[1]+…A[i],B 陣列為 A 陣列的前綴和。
輸入
輸入的第一行有一個整數 N (1 <= N <= 200000),代表 A 陣列大小。
第二行有 N 個整數以空白分隔,依序表示 A[0], A[1], A[2] … A[N-1]。
陣列中數字的絕對值不會超過 10^9。
5
1 2 3 4 5
輸出
輸出一行,其中有 N 個整數以空白分隔,依序表示 B[0], B[1], B[2] … B[N-1]。
1 3 6 10 15
解題思路
就是將自己和前面的所有項目加起來,所以用一個整數去累加,然後不斷輸出該整數即可。
注意!累加的總數可能是負值也會超過 int 上限,要使用 long long。
本題不做 IO 優化也能過。
完整程式碼
AC (21ms, 1.1MB)
| #include <stdio.h>#define BUFSIZ 1048576
 
 inline char readChar()
 {
 static char buffer[BUFSIZ], * now = buffer + BUFSIZ, * end = buffer + BUFSIZ;
 if (now == end)
 {
 if (end < buffer + BUFSIZ)
 return EOF;
 end = (buffer + fread(buffer, 1, BUFSIZ, stdin));
 now = buffer;
 }
 return *now++;
 }
 
 inline char readLongLong(long long* dst)
 {
 register char ch;
 while ((ch = readChar()) < '-')
 if (ch == EOF) return 0;
 if (ch == '-')
 {
 *dst = readChar() ^ '0';
 while ((ch = readChar()) >= '0')
 * dst = (*dst << 3) + (*dst << 1) + (ch ^ '0');
 *dst = ~*dst + 1;
 }
 else
 {
 *dst = ch ^ '0';
 while ((ch = readChar()) >= '0')
 * dst = (*dst << 3) + (*dst << 1) + (ch ^ '0');
 }
 return 1;
 }
 
 inline void putLongLong(register long long src, const char suffix)
 {
 register unsigned long long div;
 char buffer[22], * st = buffer + 20;
 *st = suffix, * (st + 1) = 0;
 if (src < 0)
 {
 src = ~src + 1;
 *(--st) = src - ((div = src / 10) << 3) - (div << 1) + '0';
 while (src = div)
 * (--st) = src - ((div = src / 10) << 3) - (div << 1) + '0';
 *(--st) = '-';
 }
 else
 {
 do
 {
 *(--st) = src - ((div = src / 10) << 3) - (div << 1) + '0';
 } while (src = div);
 }
 fputs(st, stdout);
 }
 
 int main()
 {
 register long long sum = 0;
 long long tmp;
 scanf("%*lld");
 while (readLongLong(&tmp))
 putLongLong((sum += tmp), ' ');
 return 0;
 }
 
 |