C语言程序设计方案-大数运算 .docx
精品名师归纳总结#include <stdio.h> #include <string.h> #include <ctype.h> #define MAXN 1010/*将中意 XX,XXXX,XXXX格式的字符串 s 转换为数字串储备在数组shu 中*/int get_shuchar *s, int shuint index = 0 。char* point 。sscanfs, "%d", &shuindex+。 / 从 s中猎取第一个数到num 中for 。 / 先找',' 假如找到了将该位置的字符转变为 ' '空格后再从这个位置读取数字point = strchrs, ',' 。/从 s 中找到第一个 ',' 将其的址存在 point 中ifpoint = NULL break。 / 假如没有找到 ',' 就说明到终点 脱离循环*point = ' ' 。/ 找到 ','后 将其转变为 ' '空格sscanfpoint, "%d", &shuindex+。 / 从空格处向后猎取数字到 num 中int i, temp 。 /index 记录数组中数的个数将数组反转 高位在后 低位在前fori = 0 。 i < index / 2 。 i+ temp = shui 。shui = shuindex - i - 1。shuindex - i - 1 = temp 。return index 。 /返回 index 的值 即数组长度 留意长度比下标大1/*做加法的函数 适用于同号的情形*/int addint *s1, int len1, int *s2, int len2, int *resint len = len1 > len2 . len1: len2 。 /以两个数串种最长的长度为基准作为运算次数int index, delta = 0 。forindex = 0 。 index < len 。 index+/ 从低位到高位进行运算resindex = s1index + s2index + delta。delta = resindex / 10000 。resindex %= 10000 。ifdelta resindex+ = delta。/假如最终仍有进位就数位 +1 并且进位作为最高位return index 。/ 返回结果的长度可编辑资料 - - - 欢迎下载精品名师归纳总结/*做减法的函数 适用于异号的情形*/int subint *s1, int len1, int *s2, int len2, int *res, int *len0int len, *up, *dn。 /len 用来记录运算次数up 指向确定值较大的数dn 指向确定值较小的数whilelen1 = len2 && len1 > 1 && s1len1-1 = s2len2-1 /.假如两个数串的长度相同且高位相同 就不断向后缩减长度 len1- 。 len2- 。 / 由于相同的高位会被抵消但是这个循环至少给两个数串留1 位len = len1 > len2 . len1: len2 。 /取较长的长度作为运算次数iflen1 .= len2/.当两数串长度不等的时候up = len1 > len2. s1: s2 。 /. 长度长的确定值确定大赋值给 up dn = up = s1. s2: s1 。 /. 短的给 dnelse/ 当两数串长度相等的时候up = s1len1-1 > s2len2-1. s1: s2 。/比较最高位的值大的数给 up dn = up = s1. s2: s1 。int index, delta = 0 。/ 这里开头从低位向高位运算forindex = 0 。 index < len 。 index+resindex = upindex - delta - dnindex。ifresindex < 0 /发生借位resindex += 10000 。delta = 1 。elsedelta = 0 。whileindex > 1 && resindex - 1 = 0/消去前导 0 但至少保留 1 位index- 。*len0 = index 。 /讲长度赋值给主函数中的len0return up = s1 。 / 假如 s1 的值大就返回真否就返回假在主函数中用来判定结果的符号int main/分别定义了第一个数其次个数 和运算结果的数组长度 以及正负int shu1MAXN, len1, isneg1 。int shu2MAXN, len2, isneg2 。int resMAXN, len0, isneg0 。/.enter 猎取输入的字符串可编辑资料 - - - 欢迎下载精品名师归纳总结char enterMAXN。whilegetsenter / 猎取一行ifenter0 = '0'break 。 / 假如为空字符串就退出循环char* point = strchrenter, '.' 。 /定义一个字符指针从 enter 中找'.' 字符作为分界线*point = '0' 。/ 在找到的 '。'字符转变为字符串结尾标志这样把 enter 划分为两个字符串 一个以 enter 打头 一个以 point+1memsetshu1, 0, sizeofshu1 。/讲两个数串清零 这一步特别重要memsetshu2, 0, sizeofshu2 。/由于对于长度不等的数串做运算的时候我们都是将短的数串后面当作0 看待的len1 = get_shuenter, shu1。/ 将第一个字符串中的数猎取到num1 中len2 = get_shupoint + 1, shu2 。 /将其次个字符串中的数猎取到num2 中ifshu1len1 - 1 < 0/假如第一个字符串最高为位负shu1len1 - 1 = -shu1len1 - 1 。/. 就转变为正isneg1 = 1 。/ 并且将负标记设为1elseisneg1 = 0 。/ 否就设为 0 ifshu2len2 - 1 < 0/同理isneg2 = 1 。shu2len2 - 1 = -shu2len2 - 1 。else/*. 我们将数串都看作正的并且标记其正负 这样利于运算 */ isneg2 = 0 。ifisneg2 = isneg1/同号时 就看作加法len0 = addshu1, len1, shu2, len2, res 。isneg0 = isneg1 。else/ 异号时 就看作减法ifsubshu1, len1, shu2, len2, res, &len0/假如 num1 的数值大isneg0 = isneg1 。/ 就最终结果的符号跟随num1elseisneg0 = isneg2 。/ 否就跟随 num2int index 。forindex = len0 - 1 。 index >= 0 。 index-/ 将储存结果的res 数串从高到低输出ifindex = len0 - 1/假如是最高位 就依据标记 判定是否输出负号'-'ifisneg0 && resindex printf"-"。 / 有一种情形除外就是仅有 1 位且为 0 这时候不输出 '-'号printf"%d", resindex。elseprintf",%04d", resindex。/ 其他数保留前导零4 位输出printf"n" 。return 0 。可编辑资料 - - - 欢迎下载精品名师归纳总结可编辑资料 - - - 欢迎下载