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判断语句比较好理解...

面对对象程序设计_task2_1001.A+B Format (20)的更多相关文章

  1. 201771010135 杨蓉庆《面对对象程序设计(java)》第十八周学习总结

    1.实验目的与要求 (1) 综合掌握java基本程序结构: (2) 综合掌握java面向对象程序设计特点: (3) 综合掌握java GUI 程序设计结构: (4) 综合掌握java多线程编程模型: ...

  2. 201771010135 杨蓉庆AND张燕 《面对对象程序设计(java)》第十一周学习总结

    1.实验目的与要求 (1) 掌握Vetor.Stack.Hashtable三个类的用途及常用API: (2) 了解java集合框架体系组成: (3) 掌握ArrayList.LinkList两个类的用 ...

  3. 周强 201771010141《面对对象程序设计(java)》第十周学习总结

    ---恢复内容开始--- 1.实验目的与要求 (1) 理解泛型概念: (2) 掌握泛型类的定义与使用: (3) 掌握泛型方法的声明与使用: (4) 掌握泛型接口的定义与实现: (5)了解泛型程序设计, ...

  4. 201771010135 杨蓉庆《面对对象程序设计(java)》第十六周学习总结

    1.实验目的与要求 (1) 掌握线程概念: (2) 掌握线程创建的两种技术: (3) 理解和掌握线程的优先级属性及调度方法: (4) 掌握线程同步的概念及实现技术: 一.理论知识 ⚫ 线程的概念 (1 ...

  5. 201771010135 杨蓉庆《面对对象程序设计(java)》第十五周学习总结

    1.实验目的与要求 (1) 掌握Java应用程序的打包操作: (2) 了解应用程序存储配置信息的两种方法: (3) 掌握基于JNLP协议的java Web Start应用程序的发布方法: (5) 掌握 ...

  6. 201771010135 杨蓉庆/张燕/杨玲《面对对象程序设计(java)》第十四周学习总结

    1.实验目的与要求 (1) 掌握GUI布局管理器用法: (2) 掌握各类Java Swing组件用途及常用API 一.理论知识  Swing和MVC设计模式 (1)设计模式(Design patte ...

  7. 201771010135 杨蓉庆《面对对象程序设计(java)》第十二周学习总结

    1.实验目的与要求 (1) 掌握Java GUI中框架创建及属性设置中常用类的API: (2) 掌握Java GUI中2D图形绘制常用类的API: (3) 了解Java GUI中2D图形中字体与颜色的 ...

  8. 201771010135 杨蓉庆《面对对象程序设计(java)》第十周学习总结

    1.实验目的与要求 (1) 理解泛型概念: (2) 掌握泛型类的定义与使用: (3) 掌握泛型方法的声明与使用: (4) 掌握泛型接口的定义与实现: (5)了解泛型程序设计,理解其用途. 一.理论知识 ...

  9. 201771010135杨蓉庆 《面对对象程序设计(java)》第九周学习总结

    第7章 异常.日志.断言和调试 1.实验目的与要求 (1) 掌握java异常处理技术: (2) 了解断言的用法: (3) 了解日志的用途: (4) 掌握程序基础调试技巧: 一.理论知识 1.异常:在程 ...

随机推荐

  1. [九省联考 2018]一双木棋chess

    Description 题库链接 给出一个 \(n\times m\) 的棋盘,棋盘的每个格子有两个权值 \(A,B\) . Alice 和 Bob 轮流操作在棋盘上放棋子,一个格子能放棋子的前提条件 ...

  2. 封装RabbitMQ.NET Library 的一点经验总结 转载

    这篇文章内容会很短,主要是想给大家分享下我最近在做一个简单的rabbitmq客户端类库的封装的经验总结,说是简单其实一点都不简单.为了节省时间我主要按照Library的执行顺序来介绍,在你看来这里仅仅 ...

  3. 面试7 GC机制中如何判断一个对象是否任在使用

    GC 通过在使用的根引用遍历所有引用的对象实例,当一个对象不能被遍历时,将被视为不能被使用.

  4. select SCOPE_IDENTITY()用法

    select SCOPE_IDENTITY() 返回上面操作的数据表最后row的IDENTITY 列的值: 返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值.一个作用域 ...

  5. 【原】Redis实现生成自增流水号

    场景: 公司内部有个业务场景是后台审核之后需要生成一个流水号,规则是: 201807280001,201807280002,201807280003,后面四位依次递增,前面年月日取当前时间并且转换成y ...

  6. IntelliJ IDEA创建spring-boot项目

    开发环境: jdk版本:JDK8 maven版本:maven-3.5.2 开发工具:Itellij IDEA 2017.1 前提条件:已安装以上软件并配置好jdk和maven的环境变量 创建步骤: 点 ...

  7. Bash:生成随机文件内容

    有的时候为了做些读写测试需要一些指定大小的文件,这时候可以通过下面的方法得到 dd if=/dev/urandom of=rnd_tmp_file bs=1M count=100 使用dd工具以Lin ...

  8. c#无边窗体实现移动的两种方式

    转载:http://blog.csdn.net/dxsh126/article/details/2940226 首先,要用到一个WimdowsAPI函数,因此必须引入 using System.Run ...

  9. 原 java调整数据顺序是奇数位于偶数的前面(思路与实现)

    题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 思路一: 首先这 ...

  10. Hive常用配置

    1.配置hive在HDFS上的根目录位置 <property> <name>hive.metastore.warehouse.dir</name> <valu ...