- 1、本文档共17页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
目录
问题描述…………………………………………………
设计思路…………………………………………………
数据结构设计……………………………………………
功能函数设计……………………………………………
程序代码…………………………………………………
运行与测试………………………………………………
设计心得…………………………………………………
一、大数相乘
1、问题描述:
1输入两个相对较大的正整数,能够通过程序计算出其结果
2、设计思路:
1首先考虑设计将两个大数按照输入顺序存入分别存入数a[ ],b[ ]中.
2把这个数组中的每一位数字单独来进行乘法运算,比如我们可以用一个数字和另外一个数组中的每一位去相乘,从而得到乘法运算中一行的数字,再将每一行数字错位相加。这就是乘法运算的过从低位往高位依次计算,同时确定每一列的项数,确定每一位上的结果存入数组c[ ]中.
3找到最高位在数组中的项c[i],然后依次输出各位上的数值
4通过主函数来调用其它各个函数。
3、数据结构设计:
1输入阶段采用一维数组a[ ],b[ ]在输入阶段当大数输入时, 大数a,b从高位到低位分别依次存入数组a[ ],b[ ]。
2调用函数计算阶段采用一维数组c[ ]在调用sum(a,b,m,n)函数中,在计算过程中,由个位到高位依次计算各位的结果,并依次存入数组c[ ]中。
4、功能函数设计:
1找出每一列的所有项
首先找规律,如下所示
进行乘法:
a[0] a[1] a[2]
b[0] b[1] b[2]
b[2]a[0] b[2]a[1] b[2]a[2]
b[1]a[0] b[1]a[1] b[1]a[2]
b[0]a[0] b[0]a[1] b[0]a[2]
下标之和 0 1 2 3 4
i=4 i=3 i=2 i=1 i =0(循环时的i的数值)
即有
下标之和=m+n-2-i,由此限定条件可设计循环得出每一列的所有项。
故首先解决了找出每一列所有项的问题。
2计算从低位到高位每一位的值。
显然考虑到进位的问题,故必须从低位到高位依次计算,对于每一列 ,第一项可以除十取余数,保留在原位,存入c[ ] ,所得商进位存入mm。然后对于第二列,第一项加进位mm,然后取余数存入su,再加第二项,取余数存入c[ ],求商存入进位mm,直到该列所有项参与运算到该列结束时,求的最终的c[ ],和mm. 依次进行后面的运算。
3找出反向存入结果c[ ]中的首项.
因为最高位一定不为零,故可以设计程序从c[399]开始判断,当c[i]不等于零时,即为最高项。
4设计主函数,依次调用如上函数。然后通过for循环
5、程序代码:
#include stdio.h
#include math.h
void sum(int a[200],int b[200],int m,int n)//结果在数组里顺序是反着的
{
int mm=0;//保存进位
int c[400]={0};//保存结果
int i,j,su,tt;
for(i=0;im+n;i++)
{
su=0;
for(j=0;jm;j++)
{
if((tt=(m-1+n-1-i-j))=n||(tt=(m-1+n-1-i-j))0)
continue;
else
su=su+a[j]*b[m-1+n-1-i-j];
}
su=su+mm;
c[i]=su%10;
mm=su/10;
}
printf(\n***************************\n);
printf(结果是:\n);
for(i=399;i=0;i--)//找首位
{
if(c[i]!=0)
{
tt=i;break;
}
else continue;
}
for(i=tt;i=0;i--)//输出
printf(%d,c[i]);
printf(\n);
}
void main()
{
int i,m,n,c;
int a[200]={0},b[200]={0};
printf(***************************\n);
printf(请输入第一个数字:\n);
for(i=0;(c=getchar())!=\n;i++)
a[i]=c-48;
m=i;
printf(\n***************************\n);
printf(请输入第二个数字:\n);
for(i=0;(c=
文档评论(0)