zoukankan      html  css  js  c++  java
  • 大数运算

    大数加法:

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 #define M 100
     5 char *add(char s1[],char s2[]);
     6 int main(){
     7     char s1[M],s2[M],*s;        //此时不能使用strlen(s),s没有初始化。
     8     scanf("%s",&s1);
     9     printf("+
    ");
    10     scanf("%s",&s2);
    11     printf("=
    ");
    12     s=add(s1,s2);                //必须同为指针类型
    13     printf(s);
    14     printf("
    ");
    15 }
    16 
    17 char *add(char s1[],char s2[]){
    18     int i,j,t,m,max,len1,len2;
    19     int a[M],b[M],c[M];
    20     char *s;
    21     s=(char*)malloc(M*sizeof(char));     //分配内存是为了返回该指针时内有数据。
    22     len1=strlen(s1);
    23     len2=strlen(s2);
    24     for(i=0,j=len1-1;i<len1;i++,j--)
    25         a[i]=s1[j]-'0';                    //做整形时a[0]存放的是数的最低位个位
    26     for(i=0,j=len2-1;i<len2;i++,j--)
    27         b[i]=s2[j]-'0';
    28     max=len1>len2?len1:len2;
    29     t=0;m=0;
    30     if(len1==max)                            //将小的数后面用0补全,不然后面对位相加时会出现问题
    31         for(i=len2;i<max;i++)b[i]=0;
    32     else
    33         for(i=len1;i<max;i++)a[i]=0;
    34     for(i=0;i<max;i++){                        //对位相加
    35         t=a[i]+b[i]+m;
    36         m=t/10;
    37         c[i]=t%10;
    38     }
    39     if(m!=0)                                //最高是否进位
    40         c[i]=m;
    41     else 
    42         i--;
    43     for(j=0;i>=0;i--,j++){
    44         s[j]=c[i]+'0';
    45         //printf("%d",c[i]);
    46     }
    47     s[j]='';                                //字符串结束符,不然会输出“烫烫。。。”
    48     return s;
    49 }

    大数减法:

     1 char *sub(char s1[],char s2[]){
     2     int a[M],b[M],c[M];
     3     int i,j,t,m,len1,len2,max;
     4     char *s=(char*)malloc(M*sizeof(char));
     5     len1=strlen(s1);
     6     len2=strlen(s2);
     7     max=len1>len2?len1:len2;
     8     if(len1>len2||(len1==len2&&s1[0]>=s2[0])){//s1>=s2   
     9     for(i=0,j=len1-1;i<len1;i++,j--)                        //使a[]为较大数,b[]为较小数
    10         a[i]=s1[j]-'0';
    11     for(i=0,j=len2-1;i<len2;i++,j--)
    12         b[i]=s2[j]-'0';
    13     for(i=len2;i<max;i++)                                  //将小的数高位用0补齐
    14             b[i]=0;
    15     s[0]=' ';                                                            //正数
    16     }
    17     else {                                                                //s1<s2        
    18     for(i=0,j=len1-1;i<len1;i++,j--)
    19         b[i]=s1[j]-'0';
    20     for(i=0,j=len2-1;i<len2;i++,j--)
    21         a[i]=s2[j]-'0';
    22     for(i=len1;i<max;i++)
    23             b[i]=0;
    24     s[0]='-';                                                    //负数
    25     }
    26     
    27     m=0;
    28     for(i=0;i<max;i++){                                    //对位相减
    29         t=a[i]-b[i]+m;
    30         if(t<0){
    31             c[i]=t+10;
    32             m=-1;
    33         }
    34         else{
    35             c[i]=t;
    36             m=0;
    37         }
    38     }
    39     for(i=max-1,j=1;i>=0;i--,j++)
    40         s[j]=c[i]+'0';
    41     i=1;                                                        //删除字符串之前的0
    42     while(s[i]=='0'&&i<j-1)
    43         i++;
    44     for(j=1;i<=max;j++,i++)
    45         s[j]=s[i];
    46     s[j]='';
    47     return s;
    48 }
  • 相关阅读:
    穷举、迭代、以及while代替for循环的使用
    for循环与for循环嵌套
    day07 数据类型补充
    day06
    day05
    day04
    python2 和 python3 的区别
    day03
    第一周笔记
    day02笔记
  • 原文地址:https://www.cnblogs.com/zzsf/p/3887080.html
Copyright © 2011-2022 走看看