#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <cstdlib> #define N 2333 #define zxy(i , a , b) for(int i = a ; i <= b ; i ++) #define yxz(i , a , b) for(int i = a ; i >= b ; i --) #define zxyzxy(i , a , b) for(int i = a ; i < b ; i ++) #define yxzyxz(i , a , b) for(int i = a ; i > b ; i --) using namespace std; int read() { int ans = 0; char ch = getchar(),last = ' '; while(ch < '0' || ch > '9') last = ch , ch = getchar(); while(ch >= '0' && ch <= '9') ans = ans * 10 +ch - '0' , ch = getchar(); if(last == '-') ans = -ans; return ans; } void put(int x) { if(x < 0) { putchar('-'); x = -x; } if(x == 0) { putchar('0'); return; } int q[100] , nn = 0; while(x) q[++ nn] = x % 10 , x /= 10; while(nn) putchar('0' + q[nn]), --nn; } int a[N],b[N],c[N * 10],n1,n2,n3,x,i,j; char s[N],s1[N],s2[N]; int main() { freopen("bigadd.in","r",stdin); freopen("bigadd.out","w",stdout); scanf("%s",s1); scanf("%s",s2); n1 = strlen(s1); n2 = strlen(s2); for(i = 0 ; i < n1 ; i ++) a[i] = (int)s1[n1 - i - 1] - (int)'0'; for(i = 0 ; i < n2 ; i ++) b[i] = (int)s2[n2 - i - 1] - (int)'0'; for(i = 0 ; i < n1 ; i ++) { x = 0; c[i] += a[i] + b[i] + x; x = c[i] / 10; c[i] = c[i] % 10; c[i + 1] = x; } n3 = n1 + n2; while(c[n3] == 0 && n3 > 0) n3--; yxz(i , n3 , 0) put(c[i]); return 0; }
emmm……在循环加法的时候只循环了第一位数,所以只要有第二个数的位数大于第一个就j了。23333
另一种高精度加法:
#include<cstring> #include<algorithm> #include<iostream> using namespace std; struct node//定义一个结构体,用来储存一个数的位数和每一位上的数 { int len,a[1000]; node()//初始化结构体 { len=0; memset(a,0,sizeof(a)); } }; node jiafa(node n1,node n2)//定义新的函数“jiafa”,用来进行高精度计算 { //初始化 node n0; n0.len=max(n1.len,n2.len);//n0的长度一定是大于等于最长的那个位数,所以要初始为这个值 //模拟加法,但先不进位 for(int i=1;i<=n0.len;i++) n0.a[i]=n1.a[i]+n2.a[i]; //加完了,统一进位 for(int i=1;i<=n0.len;i++) { n0.a[i+1]+=n0.a[i]/10; n0.a[i]%=10; } //研究最高位是哪位 int i=n0.len; while(n0.a[i+1]>0) { i++; n0.a[i+1]+=n0.a[i]/10; n0.a[i]%=10; } while((n0.a[i]==0)&&(i>1)) i--; n0.len=i; return n0; } int main() { char st[1010]; node n1,n2,n0; scanf("%s",st+1);//输入字符串,从第一个位置开始存 n1.len=strlen(st+1);//取 for(int i=1;i<=n1.len;i++)//降序排列放入数组,便于进位 n1.a[n1.len-i+1]=st[i]-'0'; scanf("%s",st+1); n2.len=strlen(st+1); for(int i=1;i<=n2.len;i++) n2.a[n2.len-i+1]=st[i]-'0'; n0=jiafa(n1,n2); for(int i=n0.len;i>=1;i--)//反着输出,因为是降序存入 printf("%d",n0.a[i]); return 0; }
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <cstdlib> #define N 2333 #define zxy(i , a , b) for(int i = a ; i <= b ; i ++) #define yxz(i , a , b) for(int i = a ; i >= b ; i --) #define zxyzxy(i , a , b) for(int i = a ; i < b ; i ++) #define yxzyxz(i , a , b) for(int i = a ; i > b ; i --) using namespace std; int read() { int ans = 0; char ch = getchar(),last = ' '; while(ch < '0' || ch > '9') last = ch , ch = getchar(); while(ch >= '0' && ch <= '9') ans = ans * 10 +ch - '0' , ch = getchar(); if(last == '-') ans = -ans; return ans; } void put(int x) { if(x < 0) { putchar('-'); x = -x; } if(x == 0) { putchar('0'); return; } int q[100] , nn = 0; while(x) q[++ nn] = x % 10 , x /= 10; while(nn) putchar('0' + q[nn]), --nn; } int a[N],b[N],c[N * 10],n1,n2,n3,x,i,j; char s[N],s1[N],s2[N]; int main() { freopen("test.in","r",stdin); freopen("test.out","w",stdout); scanf("%s",s1); scanf("%s",s2); n1 = strlen(s1); n2 = strlen(s2); for(i = 0 ; i < n1 ; i ++) a[i] = (int)s1[n1 - i - 1] - (int)'0'; for(i = 0 ; i < n2 ; i ++) b[i] = (int)s2[n2 - i - 1] - (int)'0'; for(i = 0 ; i < n1 ; i ++) { if(a[i] < b[i]) a[i] += 10,a[i + 1] = a[i + 1] - 1; c[i] = a[i] - b[i]; } n3 = n1 + n2; while(c[n3] == 0 && n3 > 0) n3--; yxz(i , n3 , 0) put(c[i]); return 0; }
这个高精度减法是删减版,有负数的情况还没判断,所以只要判断一下就行:
#include <cstdio> #include <iostream> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <cstdlib> #include <string> #define N 2333 #define zxy(i , a , b) for(int i = a ; i <= b ; i ++) #define yxz(i , a , b) for(int i = a ; i >= b ; i --) #define zxyzxy(i , a , b) for(int i = a ; i < b ; i ++) #define yxzyxz(i , a , b) for(int i = a ; i > b ; i --) using namespace std; int read() { int ans = 0; char ch = getchar(),last = ' '; while(ch < '0' || ch > '9') last = ch , ch = getchar(); while(ch >= '0' && ch <= '9') ans = ans * 10 +ch - '0' , ch = getchar(); if(last == '-') ans = -ans; return ans; } void put(int x) { if(x < 0) { putchar('-'); x = -x; } if(x == 0) { putchar('0'); return; } int q[100] , nn = 0; while(x) q[++ nn] = x % 10 , x /= 10; while(nn) putchar('0' + q[nn]), --nn; } char sa[N],sb[N]; int a[N],b[N],c[N]; int alen,blen,clen,i,j; int cmp(string a,string b) { if(strlen(sa)>strlen(sb))return 1; else if(strlen(sa)<strlen(sb))return -1; else { int i,l=strlen(sa); for(i=0;i<l;i++) { if(sa[i]>sb[i])return 1; else if(sa[i]<sb[i])return -1; } } return 0; } int main() { cin>>sa>>sb; if(cmp(sa,sb)==0) { put(0); return 0; } else if(cmp(sa,sb)==-1) { cout<<'-'; char t[N]; strcpy(t,sa); strcpy(sa,sb); strcpy(sb,t); } alen=strlen(sa); blen=strlen(sb); clen=max(alen,blen); for(i=0;i<alen;i++) a[alen-i]=sa[i]-'0'; for(i=0;i<blen;i++) b[blen-i]=sb[i]-'0'; for(i=1;i<=clen;i++) c[i]=a[i]-b[i]; for(i=1;i<=clen;i++) if(c[i]<0) c[i]+=10,c[i+1]--; while(c[clen]==0&&clen>1)clen--; for(i=clen;i>=1;i--) put(c[i]); cout<<endl; }
高精度乘法,很简单。
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <cmath> #include <cstdlib> using namespace std; #define zxy(i , a , b) for(int i = a ; i <= b ; i ++) #define zxyzxy(i , a , b) for(int i = a ; i < b ; i ++) #define yxz(i , a , b) for(int i = a ; i >= b ; i --) #define yxzyxz(i , a , b) for(int i = a ; i > b ; i --) #define N 2333 int read() { int ans = 0; char ch = getchar(),last = ' '; while(ch < '0' || ch > '9') last = ch , ch = getchar(); while(ch >= '0' && ch <= '9') ans = ans * 10 +ch - '0' , ch = getchar(); if(last == '-') ans = -ans; return ans; } void put(int x) { if(x < 0) { putchar('-'); x = -x; } if(x == 0) { putchar('0'); return; } int q[100] , nn = 0; while(x) q[++ nn] = x % 10 , x /= 10; while(nn) putchar('0' + q[nn]), --nn; } int a[N],b[N],c[N]; char s1[N],s2[N]; int main () { int n1 , n2 , n3 , x , i , j; scanf("%s",s1); scanf("%s",s2); n1 = strlen(s1); n2 = strlen(s2); for(i = 0 ; i < n1 ; i ++) a[i] = (int)s1[n1 - i - 1] - (int)'0'; for(i = 0 ; i < n2 ; i ++) b[i] = (int)s2[n2 - i - 1] - (int)'0'; for(i = 0 ; i < n1 ; i ++) { x = 0; for(j = 0 ; j < n2 ; j ++) { c[i + j] += a[i] * b[j] + x; x = c[i + j] / 10; c[i + j] = c[i + j] % 10; } c[i + j] = x; } n3 = n2 + n1; while(c[n3] == 0 && n3 > 0) n3--; yxz(i , n3 , 0) put(c[i]); return 0; }
高精度阶乘,也很简单。‘
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <cmath> #include <cstdlib> using namespace std; #define zxy(i , a , b) for(int i = a ; i <= b ; i ++) #define zxyzxy(i , a , b) for(int i = a ; i < b ; i ++) #define yxz(i , a , b) for(int i = a ; i >= b ; i --) #define yxzyxz(i , a , b) for(int i = a ; i > b ; i --) #define N 2333 int read() { int ans = 0; char ch = getchar(),last = ' '; while(ch < '0' || ch > '9') last = ch , ch = getchar(); while(ch >= '0' && ch <= '9') ans = ans * 10 +ch - '0' , ch = getchar(); if(last == '-') ans = -ans; return ans; } void put(int x) { if(x < 0) { putchar('-'); x = -x; } if(x == 0) { putchar('0'); return; } int q[100] , nn = 0; while(x) q[++ nn] = x % 10 , x /= 10; while(nn) putchar('0' + q[nn]), --nn; } int a[N],b[N]; int main () { int n,t,i,j,k; n = read(); a[1] = 1; for (i = 1 ; i <= n ; i ++) { for (j = 1 ; j <= 1001 ; j ++) a[j] *= i; for (k = 1 ; k <= 1001 ; k ++) { a[k + 1] += a[k] / 10; a[k] %= 10; } } i = 1001; while (a[i] == 0) i--; for (j = i ; j >= 1 ; j--) put(a[j]); return 0; }
高精度除法:
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <cmath> #include <cstdlib> using namespace std; #define zxy(i , a , b) for(int i = a ; i <= b ; i ++) #define zxyzxy(i , a , b) for(int i = a ; i < b ; i ++) #define yxz(i , a , b) for(int i = a ; i >= b ; i --) #define yxzyxz(i , a , b) for(int i = a ; i > b ; i --) #define N 2333 int read() { int ans = 0; char ch = getchar(),last = ' '; while(ch < '0' || ch > '9') last = ch , ch = getchar(); while(ch >= '0' && ch <= '9') ans = ans * 10 +ch - '0' , ch = getchar(); if(last == '-') ans = -ans; return ans; } void put(int x) { if(x < 0) { putchar('-'); x = -x; } if(x == 0) { putchar('0'); return; } int q[100] , nn = 0; while(x) q[++ nn] = x % 10 , x /= 10; while(nn) putchar('0' + q[nn]), --nn; } //函数SubStract功能: //用长度为len1的大整数p1减去长度为len2的大整数p2 // 结果存在p1中,返回值代表结果的长度 //不够减 返回-1 正好够 返回0 int SubStract( int *p1, int *p2, int len1, int len2 ) { int i; if( len1 < len2 ) return -1; if( len1 == len2 ) { //判断p1 > p2 for( i = len1 - 1 ; i >= 0 ; i-- ) { if( p1[i] > p2[i] ) //若大,则满足条件,可做减法 break; else if( p1[i] < p2[i] ) //否则返回-1 return -1; } } for( i = 0 ; i <= len1 - 1 ; i++ ) //从低位开始做减法 { p1[i] -= p2[i]; if( p1[i] < 0 ) //若p1<0,则需要借位 { p1[i] += 10; //借1当10 p1[i+1]--; //高位减1 } } for( i = len1 - 1 ; i >= 0 ; i-- ) //查找结果的最高位 if( p1[i] ) //最高位第一个不为0 return (i+1); //得到位数并返回 return 0; //两数相等的时候返回0 } int main() { int n, k, i, j; //n:测试数据组数 int len1, len2; //大数位数 int nTimes; //两大数相差位数 int nTemp; //Subtract函数返回值 int num_a[N]; //被除数 int num_b[N]; //除数 int num_c[N]; //商 char str1[N + 1]; //读入的第一个大数 char str2[N + 1]; //读入的第二个大数 n = read(); while ( n-- > 0 ) { scanf("%s", str1); //以字符串形式读入大数 scanf("%s", str2); for ( i = 0 ; i < N ; i++ ) //初始化清0 { num_a[i] = 0; num_b[i] = 0; num_c[i] = 0; } len1 = strlen(str1); //获得大数的位数 len2 = strlen(str2); for( j = 0 , i = len1 - 1 ; i >= 0 ; j++ , i-- ) num_a[j] = str1[i] - '0'; //将字符串转换成对应的整数,颠倒存储 for( j = 0 , i = len2 - 1 ; i >= 0 ; j++ , i-- ) num_b[j] = str2[i] - '0'; if( len1 < len2 ) //如果被除数小于除数,结果为0 { printf("0 "); continue; //利用continue直接跳出本次循环。 进入下一组测试 } nTimes = len1 - len2; //相差位数 for ( i = len1 - 1 ; i >= 0 ; i-- ) //将除数扩大,使得除数和被除数位数相等 { if ( i >= nTimes ) num_b[i] = num_b[i - nTimes]; else //低位置0 num_b[i] = 0; } len2 = len1; for( j = 0 ; j <= nTimes ; j++ ) //重复调用,同时记录减成功的次数,即为商 { while((nTemp = SubStract(num_a,num_b + j,len1,len2 - j)) >= 0) { len1 = nTemp; //结果长度 num_c[nTimes - j]++;//每成功减一次,将商的相应位加1 } } //输出结果 for( i = N-1 ; num_c[i] == 0 && i >= 0 ; i-- );//跳过高位0 if( i >= 0 ) for( ; i >= 0 ; i-- ) printf("%d", num_c[i]); else printf("0"); printf(" "); } return 0; }