模板 高精度计算

【模板】高精度计算

 

大数相加:

 1 #include <stdio.h>

 2 #include <string.h>

 3 #include <stdlib.h>

 4 

 5 void add(char a[],char b[],char back[])

 6 {

 7     int i,j,k,up,x,y,z,l;

 8     char *c;

 9     if(strlen(a) > strlen(b))

10         l = strlen(a)+2;

11     else

12         l = strlen(b)+2;

13     c = (char*)malloc(l*sizeof(char));

14     i = strlen(a)-1;

15     j = strlen(b)-1;

16     k = 0;

17     up = 0;

18     while(j>=0 || i>=0)

19     {

20         if(i<0) x = '0';

21         else

22             x = a[i];

23         if(j<0) y = '0';

24         else

25             y = b[j];

26         z = x-'0'+y-'0';

27         if(up)

28             z++;

29         if(z>9)

30         {

31             up = 1;

32             z%=10;

33         }

34         else

35             up = 0;

36         c[k++] = z+'0';

37         i--;

38         j--;

39     }

40     if(up)

41         c[k++] = '1';

42     i = 0;

43     c[k] = '\0';

44     for(k-=1; k>=0; k--)

45         back[i++] = c[k];

46     back[i] = '\0';

47 }

48 

49 int main()

50 {

51     char c[10000],t[10000],sum[1000];

52     int m;

53     scanf("%d%*c",&m);

54     while(m--)

55     {

56         scanf("%s%s",c,t);

57         add(c,t,sum);

58         printf("%s\n",sum);

59         if(m)

60             printf("\n");

61     }

62     return 0;

63 }

 

大数加小数:

 1 void addt(char a[],int b,char c[])

 2 {

 3     int len=strlen(a);

 4     char s[100];

 5     for(int i=0; i<len; i++)

 6         s[len-i-1]=a[i]-'0';

 7     int add=0;

 8     for(int i=0;; i++)

 9     {

10         if(i>=len)

11         {

12             s[i]=0;

13             len++;

14         }

15         int k=s[i]+b%10+add;

16         b/=10;

17         if(k>=10)

18         {

19             s[i]=k%10;

20             add=k/10;

21         }

22         else

23         {

24             s[i]=k;

25             add=0;

26         }

27         if(b==0&&add==0)break;

28     }

29     for(int i=0; i<len; i++)

30         c[len-1-i]=s[i]+'0';

31     c[len]='\0';

32 

33 }

34 

35 int main()

36 {

37     char c[1000],t[1000],sum[1000];

38     int m;

39     while(~scanf("%s%d",c,&m))

40     {

41         mult(c,m,t);

42         printf("%s\n",t);

43         addt(c,m,sum);

44         printf("%s\n",sum);

45     }

46     return 0;

47 }

 

 

大数相乘:

 1 #include <stdio.h>

 2 #include <string.h>

 3 

 4 void mult(char a[],char b[],char s[])

 5 {

 6    int i,j,k = 0,alen,blen,sum = 0,res[65][65]={0},flag = 0;

 7    char result[65];

 8    alen = strlen(a);

 9    blen = strlen(b);

10    for(i = 0;i<alen;i++)

11    {

12        for(j = 0;j<blen;j++)

13        res[i][j] = (a[i]-'0')*(b[j]-'0');

14    }

15    for(i = alen-1;i>=0;i--)

16    {

17        for(j = blen-1;j>=0;j--)

18        {

19            sum = sum+res[i+blen-j-1][j];

20            printf("res = %d\n",res[i+blen-j-1][j]);

21        }

22        result[k] = sum%10;

23        k++;

24        sum = sum/10;

25    }

26    for(i = blen-2;i>=0;i--)

27    {

28        for(j = 0;j<=i;j++)

29        {

30            sum = sum+res[i-j][j];

31        }

32        result[k] = sum%10;

33        k++;

34        sum = sum/10;

35    }

36    if(sum)

37    {

38        result[k] = sum;

39        k++;

40    }

41    for(i = 0;i<k;i++)

42    result[i]+='0';

43    for(i = k-1;i>=0;i--)

44    s[i] = result[k-1-i];

45    s[k] = '\0';

46    while(1)

47    {

48        if(strlen(s)!=strlen(a) && s[0] == '0')

49        strcpy(s,s+1);

50        else

51        break;

52    }

53 }

54 

55 int main()

56 {

57     char c[1000],t[1000],sum[1000];

58     int m;

59     while(~scanf("%s%s",c,t))

60     {

61         mult(c,t,sum);

62         printf("%s\n",sum);

63     }

64     return 0;

65 }

 

大数乘小数:

 1 #include <stdio.h>

 2 #include <string.h>

 3 

 4 void mult(char c[],int m,char t[])

 5 {

 6     char s[100];

 7     int len=strlen(c);

 8     for(int i=0; i<len; i++)

 9         s[len-i-1]=c[i]-'0';

10     int flag,add=0;

11     for(int i=0; i<len; i++)

12     {

13         int k=s[i]*m+add;

14         if(k>=10)

15         {

16             s[i]=k%10;

17             add=k/10;

18             flag=1;

19         }

20         else

21         {

22             s[i]=k;

23             add=0;

24             flag=0;

25         }

26     }

27     while(add)

28     {

29         s[len++]=add%10;

30         add/=10;

31     }

32     for(int i=0; i<len; i++)

33         t[len-1-i]=s[i]+'0';

34     t[len]='\0';

35 }

 

 

大数相乘:

 1 #include <stdio.h>

 2 #include <string.h>

 3 

 4 void sub(char s1[],char s2[],char t[])

 5 {

 6     int i,l1,l2,k;

 7     l2 = strlen(s2);

 8     l1 = strlen(s1);

 9     t[l1] = '\0';

10     l1--;

11     for(i = l2-1; i>=0; i--,l1--)

12     {

13         if(s1[l1]-s2[i]>=0)

14             t[l1] = s1[l1] - s2[i] + '0';

15         else

16         {

17             t[l1] = 10+s1[l1] - s2[i]+'0';

18             s1[l1-1]= s1[l1-1] -1;

19         }

20     }

21     k = l1;

22     while(s1[k]<0)

23     {

24         s1[k]+=10;

25         s1[k-1]-=1;

26         k--;

27     }

28     while(l1>=0)

29     {

30         t[l1] = s1[l1];

31         l1--;

32     }

33 loop:

34     if(t[0] == '0')

35     {

36         l1 = strlen(s1);

37         for(i = 0; i<l1-1; i++)

38             t[i] = t[i+1];

39         t[l1-1] = '\0';

40         goto loop;

41     }

42     if(strlen(t) == 0)

43     {

44         t[0] = '0';

45         t[1] = '\0';

46     }

47 }

48 

49 int main()

50 {

51     char c[1000],t[1000],sum[1000];

52     int m;

53     while(~scanf("%s%s",c,t))

54     {

55         sub(c,t,sum);

56         printf("%s\n",sum);

57     }

58     return 0;

59 }

 

大数阶乘:

 1 #include<iostream>

 2 #include<cmath>

 3 using namespace std;

 4 int main()

 5 {

 6     void factorial(int n,int *) ;

 7     int b[10000];

 8     int n;

 9     while(cin>>n)

10     {

11         factorial(n,b);

12     }

13     return 0;

14 }

15 void factorial(int n,int b[10000])

16 {

17     long a[10000];

18     int i,j,l,c,m=0,w;

19     a[0]=1;

20     for(i=1; i<=n; i++)

21     {

22         c=0;

23         for(j=0; j<=m; j++)

24         {

25             a[j]=a[j]*i+c;

26             c=a[j]/10000;

27             a[j]=a[j]%10000;

28         }

29         if(c>0)

30         {

31             m++;

32             a[m]=c;

33         }

34     }

35     w = m*4+log10(a[m])+1;

36     cout << w << endl;

37     cout<<a[m];

38     for(i=m-1; i>=0; i--)

39         cout<<a[i];

40     cout<<endl;

41 }

 

大数进制转换:

 1 #include <stdio.h>

 2 #include <string.h>

 3 

 4 void consversion(char s[],char s2[],long d1,long d2)

 5 {

 6     long i,j,t,num;

 7     char c;

 8     num = 0;

 9     for(i = 0;s[i]!='\0';i++)

10     {

11         if(s[i]<='9' && s[i]>='0')

12         t = s[i] - '0';

13         else

14         t = s[i] - 'A' +10;

15         num = num*d1+t;

16     }

17     i = 0;

18     while(1)

19     {

20         t = num%d2;

21         if(t<=9)

22         s2[i] = t+'0';

23         else

24         s2[i] = t+'A'-10;

25         num/=d2;

26         if(num == 0)

27         break;

28         i++;

29     }

30     for(j = 0;j<i/2;j++)

31     {

32         c = s2[j];

33         s2[j] = s[i-j];

34         s2[i-j] = c;

35     }

36     s2[i+1]='\0';

37 }

38 

39 int main()

40 {

41     char s1[1000],s2[1000];

42     int d1,d2;

43     while(~scanf("%s%d%d",s1,&d1,&d2))

44     {

45         consversion(s1,s2,d1,d2);

46 //将d1进制的s1转换成d2进制s2.

47         printf("%s\n",s2);

48     }

49 

50     return 0;

51 }

 

你可能感兴趣的:(模板)