面对对象程序设计_task2_1001.A+B Format (20)

Someting about 1001.A+B Format (20)

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

885780-20160127002933770-662779824.png

看到这个题目的时候,我的想法很简单,直接判断直接输出,因为给定的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判断语句比较好理解...

转载于:https://www.cnblogs.com/monsterJang/p/5161970.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值