zoukankan      html  css  js  c++  java
  • 两个大数相乘(纯C实现)

    闲着无聊,做了这个程序。可以计算1000位以内的数相乘。纯字符串处理。

     1 #include<stdio.h>
     2 #include<string.h> 
     3 #include<stdlib.h>
     4 //两个字符串相加 
     5 char* add(char *s1,char *s2)
     6 {
     7     char c[200];
     8     char *s=c;
     9     int i=strlen(s1)-1,j=strlen(s2)-1,k=0;
    10     int flag=0;
    11     int sum;
    12     for(;i>=0&&j>=0;i--,j--,k++)
    13     {
    14         sum=(s1[i]-'0')+(s2[j]-'0')+flag;
    15         (flag=sum>9)?(c[k]=sum%10+'0'):(c[k]=sum+'0');
    16     }
    17     for(;i>=0;i--,k++)
    18     {
    19         sum=(s1[i]-'0')+flag;
    20         (flag=sum>9)?(c[k]=sum%10+'0'):(c[k]=sum+'0');
    21     }
    22     for(;j>=0;j--,k++)
    23     {
    24         sum=(s2[j]-'0')+flag;
    25         (flag=sum>9)?(c[k]=sum%10+'0'):(c[k]=sum+'0');
    26     }
    27     if(flag) c[k++]='1';
    28     c[k]=0;
    29     strrev(s);
    30     return s;
    31 }
    32 //返回s1*num   0<=num<=10
    33 char* mul(char *s1,int num)
    34 {
    35     if(num==1) return s1;
    36     else if(num==0) return "0";
    37     else if(num==10) return strcat(s1,"0");
    38     int len1=strlen(s1);
    39     char str[1000];//可以计算10000位以内的数
    40     int temp=0;//表示要进位的数,如9*9=81   则num存储的是8
    41     int j=0;
    42     for(int i=len1-1;i>=0;i--)
    43     {
    44         int t=(s1[i]-'0')*num+temp;
    45         str[j++]=t%10+'0';
    46         temp=t/10;    
    47     }
    48     str[j++]=temp+'0';
    49     str[j]=0;//形成串 
    50     return strrev(str);  
    51 }
    52 
    53 //获取一个数字串的后面的零 
    54 char* getZero(char *s1)
    55 {
    56     int len1=strlen(s1);
    57     if(len1==0) return "";
    58     char *p= s1+len1;
    59     while(*--p=='0');
    60     char result[1000]="";
    61     char *q=result;
    62     strcpy(result,p+1); 
    63     p[1]=0;//修改源串,如源串为 123000   则源串变为 123 
    64     return q;
    65 }
    66 //返回 s1*s2 的结果 
    67 char* fun(char *s1,char *s2)
    68 {
    69     
    70     char ling[200]="";//存放零
    71     strcat(ling,getZero(s1)); 
    72     strcat(ling,getZero(s2));
    73     int len1=strlen(s1);
    74     int len2=strlen(s2);
    75     char sum[1000] ="0";
    76     char t[1000]="";//存放0 
    77     char temp[1000]="";//存放临时结果 
    78     for(int i=len2-1;i>=0;i--)
    79     {
    80         strcat(t,"0");
    81         strcpy(temp,mul(s1,s2[i]-'0'));
    82         strcat(temp,t);
    83         strcpy(sum,add(sum,temp));//相当于 sum += temp;     
    84     }
    85     sum[strlen(sum)-1]=0;//因为在for循环里多加了一个0,所以要去掉
    86     return strcat(sum,ling); 
    87 } 
    88 int main()
    89 {
    90     char s1[1000]="1234567894946952659526488874568224285656";
    91     char s2[1000]="1235879542668895589898986598526852694";
    92     printf("%s x %s\n",s1,s2);
    93     printf("= %s\n",fun(s1,s2));
    94     system("pause");
    95     return 0;
    96 }

  • 相关阅读:
    Swift Development – List of Resources You Must Bookmark
    Best jQuery Plugins of the Month – May 2014
    css,js移动资源
    移动技术资源
    视网膜New iPad与普通分辨率iPad页面的兼容处理
    使用匿名函数给setInterval()传递参数
    藏地传奇js
    藏地传奇瀑布流
    jQuery处理JSONP
    网易游戏js-滚动支持自适应
  • 原文地址:https://www.cnblogs.com/dzqdzq/p/3065088.html
Copyright © 2011-2022 走看看