大数除法(lld最多19位)
大数除法的核心:把除法运算转化为减法运算,根据除法运算的特点,
有两个大整数a和b,当a==b时,a/b==1,余数是0。(a!=0,b!=0)
当a>b时,a/b>=1,余数需要通过计算求得。
当a<b时,a/b=0,余数就是a。
以7546除23为例。
先减去23的100倍,就是2300,可以减3次,余下646。 此时商就是300;
然后646减去23的10倍,就是230,可以减2次,余下186。此时商就是320;
然后186减去23,可以减8次,此时商就是328.
特例
本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。
#include<stdio.h> #include<string.h> int main(){ char a[2000],q[2000]; int b,r,len,i,temp; r=0; scanf("%s",a); len=strlen(a); scanf("%d",&b); if(len==1&&a[0]-'0'<b){ printf("0 %c",a[0]); return 0; } for(i=0;i<len;i++){ temp=r*10+a[i]-'0'; q[i]=temp/b+'0'; r=temp%b; } i=0; while(q[i]=='0') i++; for (; i < len; i++) printf("%c", q[i]); printf(" %d", r); return 0; }
正常的大数除法
#include<stdio.h> #include<string.h> #define M 1000005 char s1[M],s2[M]; int a[M]; void ss(int m)//减运算 { int i=0,j; while(1) { if(s1[i]=='0') i++; else { j=i; break; } } for(; i<m; i++) s1[i]=s1[i]-s2[i]+'0'; for(i=m-1; i>j; i--) if(s1[i]<'0') { s1[i]+=10;; s1[i-1]--; } } int main() { int i,j,k,n,m; while(~scanf("%s%s",s1,s2)) { n=strlen(s1); m=strlen(s2); if(n<m||n==m&&strcmp(s1,s2)<0)//特殊情况判断 { printf("0 余数=");//求余数 for(i=0; i<n; i++) printf("%d",s1[i]-'0'); printf("\n"); continue; } k=0; while(1) { a[k]=0; while(strcmp(s1,s2)>=0)//一直进行减法,直到不能减为止 { ss(m); a[k]++; } k++; if(n==m) break; for(i=m-1; i>=0; i--) //在s2前面补0,以便进行减法运算 s2[i+1]=s2[i]; s2[0]='0'; m++; s2[m]='\0';//strcmp()函数遇到字符'\0'结束 } i=0; while(a[i]==0) i++;//去除前导0 for(; i<k; i++) printf("%d",a[i]); printf(" 余数="); j=0;//求余数 while(s1[j]=='0') j++; if(j==n) { printf("0\n"); continue; } for(; j<n; j++) printf("%d",s1[j]-'0'); printf("\n"); } return 0; }
努力变得不白