大数除法(高精度除法)解题日记 (c++源代码)

date:20100612

一开始用模拟除法写了一个,用到了加法,减法,乘法,本来还打算用二分法进行优化的,可惜程序一直没有调试对。我暂时解决不了。

 

今天用除法当减法来算。。写了一个程序。。两个数相近。。还好。。相差太远,程序跑得实在是太久了。

刚想了另一个算法。回去试试。

下面给我今天晚上写的除法。

//v1.0 #include #include void sub(char a[101],char b[101]); using namespace std; int main() { char a[101]; char b[101]; int cnt=0; cin>>a>>b; while(1) { sub(a,b); cnt++; cout<<"RUN ID is "<=0 || j>=0) { i>=0?x=a[i]-'0':x=0; j>=0?y=b[j]-'0':y=0; z=x-y+up; z<0?z+=10,up=-1:up=0; c[k++]=z+'0'; i--; j--; } up==-1?c[k]=1+'0':k--; i=0; while (k>=0) { a[i++]=c[k--]; } a[i]='/0'; while (a[0] =='0') { for(j=0; j-1

 

 

后面先写了一个高精度除单精度的。然后高精度除单精度利用减法实在算法就想出来了。可惜一直没调试好。

上面的程序就显得幼稚了。

 

输入两个整数x,y,输出它们的商。

题目要求是这样的:

输入两个整数x,y(0 <= x <= 10^100,y <= 30000)

我们可以利用系统本身的除法进行运算,

将原数分段利用除法实在.

代码如下:

#include #include #include using namespace std; int lenth(int n)//求数字长度(位数)函数 { int i=0; while(n>0) { n/=10; i++; } return i; } int main() { char a[102]; int b; cin>>a>>b;//输入除数与被除数 //cout<1&∑[0]=='0') { for(j=0; j-1

 

后面就是写高精度除高精度除法了。现在调试中,不知道会不会解决。原来用模拟人计算除法的方式写的。

要用到减法,乘法,二分法试探商。写出来可惜一直调试不对。个人水平问题吧。

 

现在利用减法处理就容易多了。其实只是变像的把试探商变做了减法而已。试探商是从最小的开始试(不用二分查找的时候)

,减法是从最大的一直到最小的。今天终于ac了,主要是条件没控制好啊。现在终于好了。

下面是代码,稍微注释一下。有可能看不懂我写的。

//v1.2 #include #include void sub(char a[102],char b[102]); void conect(char d[],char c); using namespace std; int main() { char a[102]; char b[102]; cin>>a>>b; char sum[102]; char part_of_a[102]; int i; int j=0; int cnt=0; int lenth_of_a=strlen(a); int lenth_of_b=strlen(b); if( lenth_of_a==lenth_of_b&&strcmp(a,b)<0 || lenth_of_a=0 && strlen(part_of_a)==lenth_of_b || strlen(part_of_a)>lenth_of_b || i==lenth_of_a+1 ) // 这点是关键,就不写注释了,大家用这个算法写的时候先自己琢磨,如果搞不定可以来看看。 break; sum[j++]='0'; } } sum[j]='/0'; cout<0) cout<=0 || j>=0) { i>=0?x=a[i]-'0':x=0; j>=0?y=b[j]-'0':y=0; z=x-y+up; z<0?z+=10,up=-1:up=0; c[k++]=z+'0'; i--; j--; } up==-1?c[k]=1+'0':k--; i=0; while (k>=0) { a[i++]=c[k--]; } a[i]='/0'; //清除多于的零 while (a[0] =='0') { for(j=0; j-1



最后祝大家端午快乐.

 

 

你可能感兴趣的:(解题札记)