A+B format
A+B Format
Github--A+Bformat—revisal--link
解题思路
- 1 · 输入两个整数计算出它们的和。
- 2·利用sprintf函数将两个整数的和由整型变成字符型并存入足够大的字符数组
- 3·因为负数转成字符串时负号需占数组的一个位,与正数所占数组空间不同,所以分成正数和负数两类讨论。
- 4·对于正数(字符数组长度大于3): <1> 利用strlen函数得到字符数组的长度. <2> 要按题目要求格式输出和的大小,需要从个位起每隔三位数插入一个逗号。 <3> 要插入逗号需要用%c将字符数组中的字符一个一个输出,输出过程中在合适的位置插入逗号。而输出时系统是从左到右输出,不是从右到左所以不能每输出三个数就输出一个逗号。 <4> 注意到从左到右一直到第一个逗号的数字的个数是字符数组长度除3的余数,所以循环输出单个字符时,当i+1(i从0开始自增)等于该余数时输出逗号。 <5> 第一个逗号之后的单个字符个数总数是三的倍数,所以当i+1减余数是三的倍数而且i+1大于该余数并且小于字符数组长度时输出一个逗号。
- 5.对于负数(字符数组长度大于4): <1> 负数与正数的不同之处在于负数转换成字符数组后其数字真正占的空间只有字符数组长度减1. <2> 负数第一个逗号应该在i等于i -1除以3得到的余数时输出(若不计负号占的位置,可以看成i从1开始自增) <3> 第一个逗号输出之后,余下的单个字符的总数是三的倍数,当i>余数且i>1且i<字符数组的长度减1时,如果i减余数是三的倍数则输出逗号。
bug的发现与修改
- 一开始没有发现绝对值相等的正负数转换成字符数组后占的空间大小是不同的,所以调试过程中得到的结果不正确。
- 最初百度到可以使用itoa函数将整型数据转换成字符型数据于是就是用这个函数,提交之后出现错误说itoa函数没有定义,后来才查到itoa函数不是标准定义下的C语言,linux编译器使用。而PAT就是使用linux,用itoa函数行不通。于是就改用sprintf函数。
- 使用sprintf函数提交之后还是有两个错误点。检查发现,负数的处理中,第一个逗号输出之后后面的对i的处理出了错。本应是i 减去余数再对3求余,却写成了i 对3求余,导致将-100000输出成-1000,00。