1. 程式人生 > >大數除法(lld最多19位)

大數除法(lld最多19位)

nbsp 需要 can turn 整數 strcmp() break 去除 TE

大數除法的核心:把除法運算轉化為減法運算,根據除法運算的特點,

有兩個大整數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; }

大數除法(lld最多19位)