高精度计算 加减乘
高精度加法
//高精度加法 #include<iostream> #include<cmath> #include<cstring> using namespace std; int main() { char a1[100],b1[100]; int a[100],b[100],c[100],lena,lenb,lenc,i,x; memset(a,0,sizeof(a)); //清零 memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); gets(a1); //gets()输入一个字符串,读一整行,到换行符结束。 gets(b1); lena=strlen(a1); //strlen()求长度,在此处即为位数 lenb=strlen(b1); for(i=0;i<lena;i++) //逆序,从1到lena,下标以1开始。 { a[lena-i]=a1[i]-48; } for(i=0;i<lenb;i++) { b[lenb-i]=b1[i]-48; } lenc=1; x=0; while(lenc<=lena||lenc<=lenb) { c[lenc]=a[lenc]+b[lenc]+x; x=c[lenc]/10; c[lenc]%=10; lenc++; } c[lenc]=x; if(c[lenc]==0) { lenc--; } for(i=lenc;i>=1;i--) //逆序输出 { cout<<c[i]; } cout<<endl; return 0; }
- 逆序存储
- 位数为存入的字符串的长度
- char[],可用strlen(). string可用s.length();
- gets(s),可以存入s一行字符串,直到换行符才停止。
高精度减法
//高精度减法 #include<iostream> #include<cstdio> #include<cstring> using namespace std; int main() { int a[256],b[256],c[256],lena,lenb,lenc,i; char n[256],n1[256],n2[256]; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); printf("input minuend:"); gets(n1); //被减数 printf("input subtrahead:"); gets(n2); //减数 //被减数比减数位数小,或者被减数和减数位数一样,但是被减数小于减数; //用strcmp来比较大小 if(strlen(n1)<strlen(n2)||(strlen(n1)==strlen(n2))&&(strcmp(n1,n2)<0)) { strcpy(n,n1); //用strcpy来交换被减数和减数,输出符号,再进行减法运算 strcpy(n1,n2); strcpy(n2,n); cout<<"-"; } lena=strlen(n1),lenb=strlen(n2); for(i=0;i<lena;i++) { a[lena-i]=n1[i]-'0'; } for(i=0;i<lenb;i++) { b[lenb-i]=n2[i]-'0'; } i=1; while(i<=lena||i<=lenb) { if(a[i]<b[i]) //借位 { a[i]+=10; a[i+1]--; } c[i]=a[i]-b[i]; i++; } lenc=i; while((c[lenc]==0)&&(lenc>1)) //注意个位为0时,不能减去这个位数。 lenc--; for(i=lenc;i>=1;i--) //逆序输出 { cout<<c[i]; } cout<<endl; return 0; }
- 可以用位数,初步判断两个数字的大小
- 再用strcmp可以判断两个数字的大小(通过ascii码)
- 当n1==n2时,返回0;
- 当n1>n2时,返回正整数;
- 当n1<n2时,返回负整数;
- 通过strcpy(des,src);可以将字符串src里的内容传给des;
- 字符串输入,可以分开每一位。
- 逆序改为数字数组,之所以要逆序是因为要从最小位开始加减。
高精度乘法
#include<iostream> #include<cstdio> #include<stdio.h> #include<cstring> using namespace std; int main() { char a1[101], b1[101]; int a[101], b[101], c[10001], lena, lenb, lenc, i, j, x; memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); memset(c, 0, sizeof(c)); cin >> a1; cin >> b1; lena = strlen(a1); lenb = strlen(b1); for (i = 0; i <= lena - 1; i++) { a[lena - i] = a1[i] - 48; } for (i = 0; i <= lenb - 1; i++) { b[lenb - i] = b1[i] - 48; } for (i = 1; i <= lena; i++) { x = 0; for (j = 1; j <= lenb; j++) { c[i + j - 1] = a[i] * b[j] + x + c[i + j - 1]; x = c[i + j - 1] / 10; c[i + j - 1] %= 10; } c[i + lenb] = x; } lenc = lena + lenb; while (c[lenc] == 0 && lenc > 1) { lenc--; } for (i = lenc; i >= 1; i--) { cout << c[i]; } cout << endl; return 0; }
- 从字符串数组转换为整型数组时,一定要看清长度的设定,确定是以0为基还是以1为基。
- scanf("%s",a1)的做法在vs里面显示unsafe,但是在dev c++里面没事,vs里面改成cin就没事了。