- 1、本文档共69页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
得到错误结果 原因: 读入运算符失败! 解决方法: 在读取运算符前多读取一次字符: getchar(); 问题3.5 测试结果分析 二维(多维)数组使用* 例:对一个二维数组分别按行和按列求和 #include stdio.h #define ROWS 4 #define COLS 4 int main() { int matrix[ROWS][COLS], row, col, sum; for(row=0; rowROWS; row++) for(col=0; colCOLS; col++) scanf(“%d“, matrix[row][col]); for(row=0; rowROWS; row++) { sum = 0; for(col=0; colCOLS; col++) sum += matrix[row][col]; printf(“Sum of row%d = %d\n”,row, sum); } for(col=0; colCOLS; col++) { sum = 0; for(row=0; rowROWS; row++) sum += matrix[row][col]; printf(“Sum of col%d = %d\n”,col, sum); } return 0; } 按行求和 按列求和 第三讲:程序设计方法-问题分析 * 问题3.6:超长正整数加法 【问题描述】编写程序实现两个超长正整数(每个最长80位数字)的加法运算。 【输入形式】 从键盘读入两个整数,不考虑输入高位可能为0的情况。1.?第一行是超长正整数A;2.?第二行是超长正整数B; 【输出形式】 输出只有一行,是两个长整数的运算结果,从高到低依次输出各位数字。各位数字紧密输出。 【输入样例】?134098703578230056234098 【输出样例】?134098703578464154 【样例说明】进行两个正整数加法运算,134098703578230056 + 234098 = 134098703578464154。 第三讲:程序设计方法-问题分析 * 问题3.6:问题分析 如何读入和存储超长整数?(为何不能用长整数类型long int n; scanf(“%ld”,n);来存储和读入超长整数?) 方法一:用字符串方式来读入和存储超长整数 char intstr[81]; scanf(“%s”, intstr); 方法二:用整数数组来存储超长整数,用字符方式依次读入超长整数的每位数字 int lint[80]; char d,i=0; while((d=getchar())!= ‘\n’) lint[i++] = d – ‘0’; 其它方法? * 问题3.6:解题思路 在程序中数组是从左至右方式存储的,而整数相加是从右至左(从低位到高位),同时由于被加数长短不一,造成计算和转换非常不方便。一种解决方法是整数相加前将两个整数位串首尾颠倒,与计算机存储方式一致。 如何进行超长整数加? 无论以什么方式存储超长整数,每位相加结果和进位计算方式为: dighti = (digit1i + digit2i + carry) % 10 (carry为上一次计算产生的进位) carry = (digit1i + digit2i + carry) / 10 (得到新的进位) 注意: 若以字符串方式存储超长整数,则在计算每位加和进位时,应考虑数字字符和整数数字之间的转换。 应考虑进位传递问题 当较短整数最后一位加完后仍有进位情况,如123456789+678; 当较长整数最后一位处理完后仍有进位情况,如9999999+1; 第三讲:程序设计方法-问题分析 * 问题3.6:算法设计 基于上述分析,假设以字符串形式存储整数,其超长整数相加算法如下: char istr1[82], istr2[81];int carry,sum; /*c为进位*/ (假设istr1中存放的为较长的整数) 将istr1和istr2串首尾颠倒; While istr2[i] != ‘\0’ sum = istr1[i]-’0’+istr2[i]-’0’+carry; istr1[i]=sum%10+’0’; carry=sum/10; While istr1[i]=‘\0’ carry sum = istr1[i]-’0’+carry; istr1[i]=sum%10+’0’; carry=
您可能关注的文档
- C程序设计_第五讲:程序设计方法(三)复杂数据结构设计.ppt
- C程序设计英文课件:CHAPTE 2 Types,Operators and Expressions.ppt
- C程序设计英文课件:CHAPTE 3 Control Flow.ppt
- C程序设计英文课件:CHAPTE 4 Functions and Program Structure.ppt
- C程序设计英文课件:CHAPTE 5 Pointer and Arrays.ppt
- C程序设计英文课件:CHAPTE 6 Structures.ppt
- C程序设计英文课件:CHAPTE 7 Input and Output.ppt
- C程序设计英文课件:第一章 A Tutorial Introduction.ppt
- C程序设计英文课件:复习.ppt
- 从计算机工程教育看知识、能力与工程方法浅谈.ppt
文档评论(0)