zoukankan      html  css  js  c++  java
  • 面对对象程序设计_task2_1001.A+B Format (20)

    Someting about 1001.A+B Format (20)

    **问题描述及我所写的代码:click here → **My Task

    看到这个题目的时候,我的想法很简单,直接判断直接输出,因为给定的a,b的范围都是在-1,000,0001,000,000之间,因此a与b的和sum的位数最多只能为7,所以分成需要输出0个(0<= |sum| <= 999)、1个(1000 <= |sum| <= 999999)、2个逗号(1000000 <= |sum| <=2000000)这三种情况,这三种情况都可以用a+b的绝对值|sum|判断:

    1. 对于0个逗号的情况,可以直接输出sum;

    2. 对于1个逗号的情况,尝试按照"(-)xxx,xxx"的格式输出。先根据a+b为正为负判断是否加负号,接下来前三位为|sum|/1000,后三位为|sum|%1000,注意后面三位需按%03d格式输出。

    3. 对于2个逗号的情况,按照"(-)x,xxx,xxx"的格式输出。还是先判断是否加负号,接下来第一位为|sum|/1,000,000,中间三位为|sum|/1,000%1,000,后三位为|sum|%1000,此时中间三位和后三位同样要按%03d格式输出。

    在编码过程中,

    • 第一次运行时发现忘了对负数考虑,导致出现-100,-100的情况,后来直接用条件语句判断解决;

    • 第二次时是自己测试时发现有1,10,100的情况,解决方法就是用%03d控制输出。

    自此,该题解决。写完随笔草稿的时候也把过了的代码再改进了一些。
    这里将代码贴上。

    #include<stdio.h>
    #include<stdlib.h>
    
    int main(){
    	int a, b, asum = 0, sum = 0;
    	scanf("%d %d", &a, &b);
    	asum = abs(a + b);
    	sum = a + b;
    	if(asum < 1000)
    		printf("%d\n", sum);
    	else if(1000 <= asum && asum < 1000000)
    	{
    		if(sum < 0)
    			printf("-");
    		printf("%d,%03d", asum / 1000, asum % 1000);
    	}
    	else if(asum >= 1000000)
    	{
    		if(sum < 0)
    			printf("-");
    		printf("%d,%03d,%03d", asum / 1000000, asum / 1000 % 1000, asum % 1000);
    	}
    	return 0;
    }
    

    还有一点是,在做完这个题目的时候有一个朋友向我问了他解题中的问题,我也知道了这道题的一种不同于我的思路的做法,一题多解。

    他的想法和我相差甚远,因为他是用数组来操作,将a+b的结果保存在数组当中,然后逐个扫描这个结果,根据不同的位数用if语句控制输出 "," , 核心语句大致如下:

    for(i = 0; i < n; i++) // n为char型数组str的长度
    { 
    	if(((i + 1) % 3 == n % 3) && ((i + 1) != n)) 
    	{ 
    		putchar(str[i]); 
    		putchar(','); 
    	}
    	else 
    	{ 
    		putchar(str[i]);  
    	}
    } 
    

    其实看过去,最明显的差别就是理解程度上的不同,因为这道题数的最大位数为7,所以我的做法中的几个条件语句易于理解,而

    if(((i + 1) % 3 == n % 3) && ((i + 1) != n))

    这个判断语句并不是很容易理解,但是用数组实现也确实很方便。

    写到这里的时候灵光一闪,能不能将这个数组反转存到另一个数组,在反转的过程中每3个字符后再存一个",",最后将这个数组反向输出...诶,好像更麻烦,不过还是试着实现了一下:

    void swap(char *strin, int len, char *strout)
    {
    	int cnt = 0;
    	strin += len - 1;
    	while(len)
    	{
    		*strout = *strin--;
    		strout++;
    		cnt++;
    		len--;
    		if(cnt % 3 == 0 && len)
    		{
    			*strout = ',';
    			strout++;
    		}
    	}
    }
    

    指针好像理解起来更是有点费劲,继续,在main函数中,

    n=strlen(str); 
    swap(str, n, str2);
    for(i = strlen(str2) - 1; i >= 0; i--)
    {
    	printf("%c", str2[i]);
    }
    printf("\n");
    

    果然,简直麻烦死,还是前面的数组的处理方法比较好。

    一段时间之后再回来,印象最深的就是,代码密密麻麻一堆简直看不下去,果断各种空格,各种缩进。另外,一道看似简单的题目,强行越捋思路越复杂,撇开数组,撇开指针,果然还是几个if else判断语句比较好理解...

  • 相关阅读:
    CodeForces Gym 100500A A. Poetry Challenge DFS
    CDOJ 486 Good Morning 傻逼题
    CDOJ 483 Data Structure Problem DFS
    CDOJ 482 Charitable Exchange bfs
    CDOJ 481 Apparent Magnitude 水题
    Codeforces Gym 100637G G. #TheDress 暴力
    Gym 100637F F. The Pool for Lucky Ones 暴力
    Codeforces Gym 100637B B. Lunch 找规律
    Codeforces Gym 100637A A. Nano alarm-clocks 前缀和
    TC SRM 663 div2 B AABB 逆推
  • 原文地址:https://www.cnblogs.com/monsterJang/p/5161970.html
Copyright © 2011-2022 走看看