教案一高精度计算教学内容课件.ppt
NOIP教案一、高精度计算,高精度计算,2,减法,1、输入,高精度计算,加法,乘法,2、保存,3、长度预处理,4、计算,5、输出,1、输入,2、保存,3、长度预处理,4、计算,5、输出,1、输入,2、保存,3、长度预处理,4、计算,5、输出,高精度加法,3、长度预处理,加法:长度为a,b中较长的那位,放入len1中。,if(len1len2)len1=len2;,高精度加法,4、计算,for(i=1;i=len1;+i)ai=ai+bi;ai+1=ai+1+ai/10;ai%=10;,进位,i+1位上原有的值,/处理最高位alen1上是否有值,确认长度为len1,还是len1+1位。,if(alen1+10)len1+;,高精度加法,5、输出,for(i=len1;i=1;-i)printf(”%d”,ai);,高精度加法,#include#include#includeusing namespace std;int main()int a501,b501,i,len1,len2;char st1501,st2501;memset(a,0,sizeof(a);memset(b,0,sizeof(b);scanf(%s,st1);len1=strlen(st1);for(i=1;i0)len1+;for(i=len1;i=1;-i)printf(%d,ai);return 0;,高精度减法,1、以字符数组读入,由于后面要进行比较两个高精度数的大小,故建议存放在字符串中。,char st1501,st2501;string s1,s2,s;int len1,len2,temp;scanf(”%s”,st1);s1=st1;len1=s1.size();scanf(”%s”,st2);s2=st2;len2=s2.size();If(len1len2)|(len1=len2),高精度减法,2、倒序保存在数字数组中,int a501,b501,i;memset(a,0,sizeof(a);memset(b,0,sizeof(b);for(i=1;i=len1;+i)ai=s1len1-i-48;for(i=1;i=len2;+i)bi=s2len2-i-48;,高精度减法,3、长度:,len1,高精度减法,4、计算,for(i=1;i=len1;+i)if(aibi)ai+1-;ai+=10;ai=ai-bi;,借位,/高位上有可能有多个0,while(alen1=0),高精度减法,5、输出,for(i=len1;i=1;-i)printf(”%d”,ai);,高精度减法,#include#include#include#includeusing namespace std;int main()int a501,b501,i,len1,len2,temp;char st1501,st2501;string s1,s2,s;memset(a,0,sizeof(a);memset(b,0,sizeof(b);scanf(%s,st1);s1=st1;len1=s1.size();scanf(%s,st2);s2=st2;len2=s2.size();,if(len11)len1-;for(i=len1;i=1;-i)printf(%d,ai);return 0;,高精度乘法(一),1、以字符数组读入:,char st1501,st2501;scanf(”%s”,st1);scanf(“%s”,st2);,乘法的输入和保存跟加法完全一样,只是需要多定义一个C数字数组,用于存放最终的乘积。,高精度乘法(一),2、倒序保存在数字数组中,int a501,b501,c501,i,j,len1,len2,lenc;memset(a,0,sizeof(a);memset(b,0,sizeof(b);memset(c,0,sizeof(c);len1=strlen(st1);for(i=1;i=len1;+i)ai=st1len1-i-48;len2=strlen(st2);for(i=1;i=len2;+i)bi=st2len2-i-48;,高精度乘法(一),3、长度,a的长度为len1,b的长度为len2.,高精度乘法(一),4、计算,for(i=1;i=len1;+i)for(j=1;j=len2;+j)ci+j-1=ci+j-1+ai*bj;ci+j=ci+j+ci+j-1/10;ci+j-1%=10;,进位,/确认c数组的长度,lenc=len1+len2;while(clenc=0,高精度乘法(一),5、输出,for(i=lenc;i=1;-i)printf(”%d”,ci);,高精度乘法(一),#include#include#includeusing namespace std;int main()int a501,b501,c501,i,j,len1,len2,lenc;char st1501,st2501;memset(a,0,sizeof(a);memset(b,0,sizeof(b);memset(c,0,sizeof(c);scanf(%s,st1);len1=strlen(st1);for(i=1;i1)lenc-;for(i=lenc;i=1;-i)printf(%d,ci);return 0;,高精度乘法(二),单个的整数x(0 x1000)乘以一个高精度整数。,1、高精度数和x的输入与保存。(与之前的输入保存一致),int a501,i,len,x;char st501;memset(a,0,sizeof(a);scanf(“%d”,高精度乘法(二),2、计算,for(i=1;i=len;+i)ai=ai*x;for(i=1;i=len;+i)ai+1=ai+1+ai/10;ai%=10;,进位,/确认a数组的长度,len+;while(alen9)alen+1=alen/10;alen%=10;len+;,高精度乘法(二),3、输出,for(i=len;i=1;-i)printf(”%d”,ai);,高精度乘法(二),#include#include#includeusing namespace std;int main()int a501,i,len,x;char st501;memset(a,0,sizeof(a);scanf(%d,x);scanf(%s,st);len=strlen(st);for(i=1;i9)alen+1=alen/10;alen%=10;len+;for(i=len;i=1;-i)printf(%d,ai);return 0;,练习,1、P150例1.62、P153第7题。3、P152页第1题,高精度计算,高精度计算,1、以字符数组读入:,char st1501;scanf(”%s”,st1);,2、倒序保存在数字数组中,int a501,I,len1;len1=strlen(st1);for(i=1;i=len1;+i)ai=st1len1-i-48;,/做减法时,可再放入字符串S1string s1;s1=st1;,加法与乘法,定义:int I,j,len1,len2,a501,b501;char st1501,st2501;,memset(a,0,sizeof(a);scanf(“%s”,st1);len1=strlen(st1);for(i=1;i=len1;+i)ai=st1len1-i-48;memset(b,0,sizeof(b);Scanf(“%s”,st2);Len2=strlen(st2);For(i=1;i=len2;+i)bi=st2len2-i-48;,string s1,s1,s;scanf(“%s”,st1);scanf(“%s”,st2);s1=st1;s2=st2;len1=s1.size();len2=s2.size();if(len1len2)|(len1=len2),减法,3、长度预处理,加法:长度为a,b中较长的那位,放入len1中。,If(len1len2)len1=len2;,减法:长度最多为len1。,乘法:a的长度为len1,b的长度为len2,结果放入c数组,其长度最多为len1+len2。,4、计算,for(i=1;i0)len1+;,for(i=1;i1)len1-;,for(i=1;i=len1;+i)for(j=1;j=len2;+j)ci+j-1=ci+j-1+ai*bj;ci+j=ci+j+ci+j-1/10;ci+j-1%=10;lenc=len1+len2;while(clenc=0)lenc-;,加法,减法,乘法,5、输出,for(i=lenc;i=1;-i)printf(”%d”,ci);,for(i=len1;i=1;-i)printf(”%d”,ai);,加法和减法,乘法,高精度除法,高精度除低精,1、高精度数以字符数组读入:,char st501;int x;scanf(”%s”,st1);scanf(“%d”,2、顺序保存在数字数组中,int a501,len;memset(a,0,sizeof(a);len=strlen(st);for(i=1;i=len;+i)ai=sti-1-48;,高精度除低精,3、长度预处理,除法:商最多就是高精度数的长度len中。,高精度除低精,4、计算,int yu=0;/yu记录每次的余数,初始值为0for(i=1;i=len;+i)ai+=yu*10;ci=ai/10;yu=ai%10;,要加入上次的余数,才是本次的除数,记录下本次的余数,/处理最高位c1上是否有值,确认有效长度。,j=1;while(cj=0,高精度除低精,5、输出,for(i=j;i=len;+i)printf(”%d”,ci);,高精度除低精,#include#includeusing namespace std;int i,j,len,x,yu;int a1005,c1005;char st1005;int main()scanf(%s,st);scanf(%d,高精度除低精,Thank You!,此课件下载可自行编辑修改,仅供参考!感谢您的支持,我们努力做得更好!谢谢!,