标签:ati 输入 sep amp define 结合 一个 两种方法 lib
从今天起每天刷1-2题PAT甲级
Calculate a+b and output the sum in standard format -- that is, the digits must be separated into groups of three by commas (unless there are less than four digits).
Each input file contains one test case. Each case contains a pair of integers a and b where ?106≤a,b≤106. The numbers are separated by a space.
For each test case, you should output the sum of a and b in one line. The sum must be written in the standard format.
-1000000 9
-999,991
n. [语] 逗号(comma的复数)
输入两个数,计算结果后以标准格式输出,标准格式为每隔三个数字加一个逗号(这里插一句,个人感觉这里说的不太严谨,因为并没有具体说每隔三个数字是从末尾开始还是从开头开始,我一开始以为是从开头算,如2000就是,200,0,但是这题实际上是要从结尾算,2000应该是2,000,而且输入输出样例也无法看出到底是从开头算还是结尾算,导致我一直AC不了很难受)。
如果题目没有像我一样误读的话,这题应该有两种方法,一种是处理数字,结合取余取整运算符慢慢输出,我第一次做时用的是这种方法。第二种是处理字符串,用sprintf把数字转化为字符串,然后从末尾每隔三个插入一个‘,‘,类似于顺序表插入,要分正负情况,因为负数时第一个符号是-。
#include#include #define MAXSIZE 20 int main(void) { int a, b; scanf("%d %d", &a, &b); char C[MAXSIZE]; sprintf(C, "%d", a + b); int M = 0; while (C[M] != ‘\0‘)M++; int N = M; if (a + b > 0) { for (int n = 1; (M - 3 * n) > 0; n++) { for (int m = N - 1; m >= M - 3 * n; m--) C[m + 1] = C[m]; C[M - 3 * n] = ‘,‘; N++; } } else { for (int n = 1; (M - 3 * n) > 1; n++) { for (int m = N - 1; m >= M - 3 * n; m--) C[m + 1] = C[m]; C[M - 3 * n] = ‘,‘; N++; } } C[N] = ‘\0‘; printf("%s", C); system("pause"); }
ach input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial:
K N1 aN1 N2 aN2... NKaNK
where K is the number of nonzero terms in the polynomial, Niand aNi(i=1,2,?,K) are the exponents and coefficients, respectively. It is given that 1≤K≤10,0≤NK<?<N2<N1≤1000.
For each test case you should output the sum of A and B in one line, with the same format as the input. Notice that there must be NO extra space at the end of each line. Please be accurate to 1 decimal place.
2 1 2.4 0 3.2
2 2 1.5 1 0.5
3 2 1.5 1 2.9 0 3.2
英 /,p?l?‘n??m??l/ 美 /,pɑl?‘nom??l/
n. 多项式;多词拉丁学名;表示任何多项数之和
adj. 多项的,多词的;多项式的
英 /?k‘sp??n?nt; ek-/ 美 /?k‘spon?nt/
n. [数] 指数;典型;说明者,说明物
n. 倡导者,鼓吹者,代表者,拥护者
adj. 说明的
英 /,k???‘f??(?)nt/ 美 /ko???f???nt/
n. [数] 系数;率;协同因素
adj. 合作的;共同作用的
英 /‘des?m(?)l/ 美 /‘d?s?ml/
n. 小数
adj. 小数的;十进位的
多项式相加,由于指数范围不大,所以可以构造一个数组,用下标代表指数,对应元素为系数,这样的话可以把代码简化非常多。
一开始我用的是一种略笨的方法,做了三个结构体数组,并且默认其指数是以递减的方式输入的,所以一直有两个测试点过不了,现在把错误代码也一并贴出。
#include#include #define MAXSIZE 1001 int n; double m[MAXSIZE]; int k=0; int main(void) { scanf("%d", &n); for (int i = 0; i < n; i++) { int e; double c; scanf("%d %lf", &e, &c); m[e] += c; } scanf("%d", &n); for (int i = 0; i < n; i++) { int e; double c; scanf("%d %lf", &e, &c); m[e] += c; } for (int i = 0; i < MAXSIZE; i++) if (m[i] != 0) k++; printf("%d", k); for (int i = MAXSIZE; i >= 0; i--) { if (m[i] != 0) { printf(" %d %.1f",i,m[i]); } } }
#include#include #define maxsize 10 struct a { int e; float c; }; struct a A[maxsize]; struct a B[maxsize]; struct a C[maxsize]; int M, N, K ; int main(void) { int M, N; scanf("%d", &M); for (int i = 0; i < M; i++) scanf("%d %f", &A[i].e, &A[i].c); scanf("%d", &N); for (int i = 0; i < N; i++) scanf("%d %f", &B[i].e, &B[i].c); int p = 0, q = 0; while (p != M && q != N) { if (A[p].e > B[q].e) { C[K].c = A[p].c; C[K].e = A[p].e; K++; p++; } else if (A[p].e == B[q].e) { C[K].c = A[p].c + B[q].c; C[K].e = A[p].e; K++; p++; q++; } else if (A[p].e < B[q].e) { C[K].c = B[p].c; C[K].e = B[p].e; K++; q++; } } if(p==M) while (q != N) { C[K].c = B[p].c; C[K].e = B[p].e; K++; q++; } else if(q==N) while (p != M) { C[K].c = A[p].c; C[K].e = A[p].e; K++; p++; } printf("%d ", K); for (int i = 0; i < K; i++) { if (i == K - 1) printf("%d %.1f", C[i].e, C[i].c); else printf("%d %.1f ", C[i].e, C[i].c); } }
标签:ati 输入 sep amp define 结合 一个 两种方法 lib
原文地址:https://www.cnblogs.com/z-y-k/p/11517248.html