C语言程序设计方案-大数运算_第1页
C语言程序设计方案-大数运算_第2页
C语言程序设计方案-大数运算_第3页
C语言程序设计方案-大数运算_第4页
全文预览已结束

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、#include <stdio.h>#include <string.h>#include <ctype.h>#define MAXN 1010/*将满足 XX,XXXX,XXXX格式的字符串s 转换为数字串存储在数组shu 中*/int get_shu(char *s, int shu)int index = 0;char* point;sscanf(s, "%d", &shuindex+); /从 s 中获取第一个数到num 中for(;)/ 先找 ',' 如果找到了将该位置的字符转变为' '空

2、格后再从这个位置读取数字版权文档,请勿用做商业用途point = strchr(s, ',');/从 s 中找到第一个 ',' 将其地址存在point 中 版权文档,请勿用做商业用途if(point = NULL) break;/如果没有找到 ',' 则说明到尽头脱离循环 版权文档,请勿用做商业用途*point = ' '/找到 ','后 将其转变为 ' '空格sscanf(point, "%d", &shuindex+); / 从空格处向后获取数字到 num 中 版权文

3、档,请勿用做商业用途int i, temp;/index 记录数组中数的个数将数组反转高位在后 低位在前for(i = 0; i < index / 2; i+)temp = shui;shui = shuindex - i - 1;shuindex - i - 1 = temp;return index;/返回 index 的值 即数组长度注意长度比下标大1/*做加法的函数适用于同号的情况*/int add(int *s1, int len1, int *s2, int len2, int *res)版权文档,请勿用做商业用途int len = (len1 > len2) ? l

4、en1: len2;/以两个数串种最长的长度为基准作为运算次数版权文档,请勿用做商业用途int index, delta = 0;for(index = 0; index < len; index+)/从低位到高位进行运算版权文档,请勿用做商业用途resindex = s1index + s2index + delta;delta = resindex / 10000;resindex %= 10000;if(delta) resindex+= delta;/如果最后还有进位则数位 +1 并且进位作为最高位版权文档,请勿用做商业用途return index;/ 返回结果的长度/*做减法的

5、函数适用于异号的情况*/int sub(int *s1, int len1, int *s2, int len2, int *res, int *len0)版权文档,请勿用做商业用途int len, *up, *dn;/len用来记录计算次数up指向绝对值较大的数dn 指向绝对值较小的数 版权文档,请勿用做商业用途while(len1 = len2 && len1 > 1 && s1len1-1 = s2len2-1) /!如果两个数串的长度相同且高位相同则不断向后缩减长度版权文档,请勿用做商业用途 len1-; len2-; /因为相同的高位会被抵消但是

6、这个循环至少给两个数串留len = (len1 > len2) ? len1: len2;/取较长的长度作为计算次数if(len1 != len2)/! 当两数串长度不等的时候1 位up = (len1 > len2)? s1: s2;/! 长度长的绝对值肯定大赋值给dn = (up = s1)? s2: s1;/! 短的给 dnelse/当两数串长度相等的时候up = (s1len1-1 > s2len2-1)? s1: s2;/ 比较最高位的值up大的数给up 版权文档,请勿用做商业用途dn = (up = s1)? s2: s1;int index, delta = 0

7、;/这里开始从低位向高位计算版权文档,请勿用做商业用途for(index = 0; index < len; index+)resindex = upindex - delta - dnindex;if(resindex < 0) /发生借位resindex += 10000;delta = 1;elsedelta = 0;while(index > 1 && resindex - 1 = 0)/ 消去前导0 但至少保留1 位 版权文档,请勿用做商业用途index-;*len0 = index;return up =s1;/讲长度赋值给主函数中的/如果 s1

8、的值大则返回真len0否则返回假在主函数中用来判断结果的符号 版权文档,请勿用做商业用途int main()/分别定义了第一个数第二个数 和运算结果的数组长度 以及正负int shu1MAXN, len1, isneg1;int shu2MAXN, len2, isneg2;int resMAXN, len0, isneg0;/!enter 获取输入的字符串char enterMAXN;while(gets(enter) / 获取一行if(enter0 = '0')break; / 如果为空字符串则退出循环char* point = strchr(enter, '!&#

9、39;);/ 定义一个字符指针从 enter 中找 '!'字符作为分界线版权文档,请勿用做商业用途*point = '0'/ 在找到的 ''字符转变为字符串结尾标志这样把 enter 划分为两个字符串 一个以 enter 打头 一个以 point+1 版权文档,请勿用做商业用途memset(shu1, 0, sizeof(shu1);/讲两个数串清零这一步十分重要 版权文档,请勿用做商业用途memset(shu2, 0,sizeof(shu2);/ 因为对于长度不等的数串做运算的时候我们都是将短的数串后面当作0 看待的 版权文档,请勿用做商业用途

10、len1 = get_shu(enter, shu1);/ 将第一个字符串中的数获取到num1 中 版权文档,请勿用做商业用途len2 = get_shu(point + 1, shu2);/ 将第二个字符串中的数获取到num2 中 版权文档,请勿用做商业用途if(shu1len1 - 1 < 0)/ 如果第一个字符串最高为位负版权文档,请勿用做商业用途shu1len1 - 1 = -shu1len1 - 1;/! 则转变为正isneg1 = 1;/ 并且将负标记设为 1elseisneg1 = 0;/ 否则设为 0if(shu2len2 - 1 < 0)/同理isneg2 = 1

11、;shu2len2 - 1 = -shu2len2 - 1;else/*! 我们将数串都看作正的并且标记其正负这样利于运算 */ 版权文档,请勿用做商业用途isneg2 = 0;if(isneg2 = isneg1)/ 同号时则看作加法len0 = add(shu1, len1, shu2, len2, res);isneg0 = isneg1;else/异号时则看作减法if(sub(shu1, len1, shu2, len2, res, &len0)/ 如果 num1 的数值大 版权文档,请勿用做商业用途isneg0 = isneg1;/则最终结果的符号跟随num1版权文档,请勿用做商业用途elseisneg0 = isneg2;/否则跟随num2int index;for(index = len0 - 1; index >= 0; index-)/ 将保存结果的res 数串从高到低输出版权文档,请勿用做商业用途if(index = len0 - 1)/如果是最高位则根据标记判断是否输出负号'-'版权文档,请勿用做商业用途if(isneg0 &&resindex) printf("-"

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论