开篇总述:精度计算的讲授比力杂乱,无系统的学习,且存在同法多线的方式进行同一种运算,以是我写此篇的目的只是为了直指本质,不走教科书方式,步调冗杂。
一,加法
我在此讲两种方法:
1,首先科普常识:
length()和size()函数不可统计字符型数组大小;sizeof返回的是总数组
2,为什么字符型数组可以直接接收输入而不消索引接收
缘故原由:数组名的隐式转换规则 和 输入函数的设计机制
(1)数组名的隐式转化:
在代码中直接使用字符型数组组名,它会 主动退化为指向数组首元素的指针。
s1 作为指针转达了数组的起始内存地址,输入函数(如 scanf)会从该地址开始 连续写入字符,直到碰到终止符(如空格、换行或字符串结束符 \0)
(2)输入函数工作机制:
以 scanf("%s", s1) 为例:
- 按格式读取:%s 表示按字符串格式读取输入。
- 连续内存写入:
- 从 s1 的起始地址开始,逐个写入字符到 s1[0], s1[1], s1[2]...
- 主动在末尾添加 \0 终止符(因此数组长度需足够大)
3,为什么其他数组不能一次输入连续读入
- 字符数组的特别性:
- 字符串本质是 连续的字符序列,天然适适用指针连续操作。
- 输入函数(如 scanf)专门为字符串设计了 %s 格式符。
- 其他范例数组:
- 比方 int a[505],每个元素可能需不同格式(如 %d),无法统一连续处理。
- 必须显式指定索引或指针偏移
好了,根本知识已经掌握了,让我们直接看代码吧。
法一:
倒置是由于加法是从后往前加的,以是倒置过来在代码里从前去后加模拟,只是换了方向。
此时内里的加法模拟, 我们先不看加号就是如许,e = c + d,e数组统计数字总和,每个位数上的数字相加,此时会出现加后为两位数,此时要往后进一位 ,以是有 e[i + 1] = e/ 10;
而原来的位数上保存个位上的数字 以是有 e = e % 10; 但之后进入下一次循环,开始加下一个位数,此时会出现一种情况,在前一位的加法内里,如果有进位发生到此处怎么把进位的数加上,以是此时有了 e += c + d 将之前的进位的情况数字加上。
法二:
只是进位的方式发生改变,此时jw单独设成一个变量,如果前面有jw,在下一次循环加上。
之后循环完毕,看是否还有进位,若还有则总位数加1,将jw变量设在开头代表进位的数字,m数组在函数内里就已经将结果输入完毕,最后只需要传入位数。
最后返回的是运算完成后数字的位数
二,减法
注意:此题重在分析:
1,减是两个数字相减,此时如果第一个数比第二个大,则可以安全相减,若比第二个小,则需要添负号,再把两数反过来相减,这就涉及到数学知识,两个数若相减,前一个数比后一个数小,则它们最后的结果相当于后面大的数减前面小的数,再在前面添负号。
2,而此时,就需要设置一个布尔范例判断两数谁小了。
原题解如下:
此时涉及到字符串的知识
字典序:
字符串比力规则。
字典序的核心规则(以 m > n 为例):
m 和 n 都是字符串,但怎么比力大小
- 从左到右逐字符比力
比力 m 和 n 的第一个字符:
- 如果 m[0] 的ASCII码 大于 n[0] → 直接判断 m > n 为 true。
- 如果 小于 → 判断为 false。
- 如果 相等 → 继承比力下一个字符。
- 若全部字符均相同
- 较长的字符串更大(比方 "hello" > "hell")。
- 长度和内容完全相同时 → m > n 为 false。
比力的是字符串内里每个字符的ASCLL编码。
m > n ,此为逐个逐个比力字符串内里逐个的字符编码,看谁先出现大的数,
但是思考 "100"和"99"这类情况,则反而判断出后面比前面大,那该怎么克服呢,只需要按我题解一样先判断是非就行。
ok,结束,下期的事我们下期再聊。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |