zoukankan      html  css  js  c++  java
  • PTA A1001&A1002

    从今天起每天刷1-2题PAT甲级
    第一天

    A1001 A+B Format (20 分)

    题目内容

    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).

    Input Specification:

    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.

    Output Specification:

    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.

    Sample Input:

    -1000000 9

    Sample Output:

    -999,991

    单词

    commas

    n. [语] 逗号(comma的复数)

    题目分析

    输入两个数,计算结果后以标准格式输出,标准格式为每隔三个数字加一个逗号(这里插一句,个人感觉这里说的不太严谨,因为并没有具体说每隔三个数字是从末尾开始还是从开头开始,我一开始以为是从开头算,如2000就是,200,0,但是这题实际上是要从结尾算,2000应该是2,000,而且输入输出样例也无法看出到底是从开头算还是结尾算,导致我一直AC不了很难受)。
    如果题目没有像我一样误读的话,这题应该有两种方法,一种是处理数字,结合取余取整运算符慢慢输出,我第一次做时用的是这种方法。第二种是处理字符串,用sprintf把数字转化为字符串,然后从末尾每隔三个插入一个',',类似于顺序表插入,要分正负情况,因为负数时第一个符号是-。

    具体代码

    #include<stdio.h>
    #include<stdlib.h>
    #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] != '')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] = '';
    	printf("%s", C);
    	system("pause");
    }

    1002 A+B for Polynomials (25 分)

    题目内容

    Input Specification:

    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.

    Output Specification:

    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.

    Sample Input:

    2 1 2.4 0 3.2
    2 2 1.5 1 0.5

    Sample Output:

    3 2 1.5 1 2.9 0 3.2

    单词

    polynomial

    英 /,pɒlɪ'nəʊmɪəl/ 美 /,pɑlɪ'nomɪəl/
    n. 多项式;多词拉丁学名;表示任何多项数之和
    adj. 多项的,多词的;多项式的

    exponent

    英 /ɪk'spəʊnənt; ek-/ 美 /ɪk'sponənt/
    n. [数] 指数;典型;说明者,说明物
    n. 倡导者,鼓吹者,代表者,拥护者
    adj. 说明的

    coefficient

    英 /,kəʊɪ'fɪʃ(ə)nt/ 美 /koʊəˈfɪʃənt/
    n. [数] 系数;率;协同因素
    adj. 合作的;共同作用的

    decimal

    英 /'desɪm(ə)l/ 美 /'dɛsɪml/
    n. 小数
    adj. 小数的;十进位的

    题目分析

    多项式相加,由于指数范围不大,所以可以构造一个数组,用下标代表指数,对应元素为系数,这样的话可以把代码简化非常多。
    一开始我用的是一种略笨的方法,做了三个结构体数组,并且默认其指数是以递减的方式输入的,所以一直有两个测试点过不了,现在把错误代码也一并贴出。

    具体代码

    正确

    #include<stdio.h>
    #include<stdlib.h>
    #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<stdio.h>
    #include<stdlib.h>
    #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);
    	}
    }

    参考博客

    【PAT甲级】1002 A+B for Polynomials (25 分)

  • 相关阅读:
    rust 宏
    umi 调试
    rust 编译器工作流
    rust 神奇的特质
    rust 生命周期2
    rust 函数-生命周期
    rust 九九乘法表
    rust 代码生成选项
    rust 编码模式
    恢复到版本并销毁之后的git提交记录
  • 原文地址:https://www.cnblogs.com/z-y-k/p/11517248.html
Copyright © 2011-2022 走看看