高精度除法:(利用了 减法)
http://poj.grids.cn/practice/2737/ 原理 : 例如 a=13455 除以 b=3 先把 3 增大为 30000 不够减 右移一位 变为 3000 这样不断的减 直到 不够减 为 1456 则 可知 商的 千位 为 4(因为 3000 是 3 的 1000倍) 这样 3000 在右移一位 300 依此类推 得到 百位、十位,个位; #include<stdio.h> #include<string.h> const int maxn=300; int a[maxn],b[maxn],c[maxn]; char str1[maxn],str2[maxn],re[maxn]; int len1,len2; int sub(int a[],int b[],int len) { int i; if(len1<len)return 0; if(len==len1) { for(i=len1-1;i>=0;i--) { if(a[i]>b[i])break; else if(a[i]<b[i]) return 0; } } for(i=0;i<len1;i++) { a[i]=a[i]-b[i]; if(a[i]<0) { a[i+1]--; a[i]+=10; } } while(a[len1-1]==0&&len1>=1)len1--; return 1; } int main() { int t,i,j; scanf("%d",&t); while(t--) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(re,0,sizeof(re)); scanf("%s%s",str1,str2); len1=strlen(str1); len2=strlen(str2); if(len1<len2){printf("0\n");continue;} int l=len1; int dis=len1-len2; for(i=0;i<len1;i++) a[i]=str1[len1-1-i]-'0'; for(i=0;i<len2;i++) b[i+dis]=str2[len2-1-i]-'0'; i=0; while(i<=dis) { if(sub(a,b+i,len2+dis-i)) { re[dis-i]++; } else i++; } for(i=l;i>=0;i--) { if(re[i]!=0)break; } if(i<0)puts("0"); else { for(;i>=0;i--)printf("%d",re[i]); printf("\n"); } } }
/*
http://poj.org/problem?id=1001
求实数的 n次方
题解:
去掉小数点 ,作为 整数相乘
注意的地方那个就是,去掉小数点后,如 0.01 去掉后 变为 了001 乘积 为 1 所以我么要注意
小数点所在的位置 ,和 积的位数进行比较 要么添加 0,要呢不添加
还有就是
10.000 的平方输出应为 100 没有小数点
*/
View Code
#include<stdio.h> #define maxn 3000 #include<string.h> #include<iostream> using namespace std; int len1,len2; int a[maxn],b[maxn],c[maxn]; char str[maxn]; void mul(int a[],int b[]) { int i,j; memset(c,0,sizeof(c)); for(i=0;i<len1;i++) { for(j=0;j<len2;j++) { c[i+j]+=a[i]*b[j]; } } for(i=0;i<len1+len2;i++) { if(c[i]>=10) { c[i+1]+=c[i]/10; c[i]=c[i]%10; } } for(i=len1+len2;i>=0;i--) { if(c[i]!=0)break; } if(i==-1)len2=0; else len2=i+1; for(i=0;i<len2;i++) { b[i]=c[i]; } } int main() { int i,d; while(cin>>str>>d) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); int len=strlen(str); int f=0,k=0; for(i=len-1;i>=0;i--) { if(str[i]=='.'){f=1;k=i;} } if(d==0){printf("1\n");continue;} len1=0; for(i=0;i<len;i++) { if(str[len-1-i]!='.') a[len1++]=str[len-1-i]-'0'; } b[0]=1; len2=1; int l=d; while(l--) { mul(a,b); } if(f==0) { for(i=len2-1;i>=0;i--) { printf("%d",b[i]); } } else { char str2[maxn]; int num=(len-1-k)*d; int l,r; if(len2<=num) { str2[num]='.'; for(i=num-1;i>=len2;i--)str2[i]='0'; for(i=len2-1;i>=0;i--)str2[i]='0'+b[i]; len2=num+1; l=0; for(i=0;i<len2;i++) { if(str2[i]!='0') { l=i; break; } } r=len2-1; for(i=len2-1;i>=0;i--) { if(str2[i]!='0'){r=i;break;} } for(i=r;i>=l;i--)printf("%c",str2[i]); } else { int h=0; for(h=len2,i=len2-1;i>=0;i--) { if(i== num -1)str2[h--]='.'; str2[h--]='0'+b[i]; } l=0; for(i=0;i<=len2;i++) { if(str2[i]!='0'){l=i;break;} } if(l==num)l++; r=len2; for(i=len2;i>=0;i--) { if(str2[i]!='0'){r=i;break;} } for(i=r;i>=l;i--)printf("%c",str2[i]); } } printf("\n"); } }