zoukankan      html  css  js  c++  java
  • hdu_1042(模拟大数乘法)

    计算n!

     1 #include<cstring>
     2 #include<cstdio>
     3 using namespace std;
     4 int num[50000];
     5 int main()
     6 {
     7     int n;
     8     while(~scanf("%d",&n))
     9     {
    10         memset(num,0,sizeof(num));
    11         int len = 1;
    12         num[1] = 1;
    13         for(int i = 2; i <= n; i++){
    14             for(int j = 1; j <= len; j++){
    15                 num[j] = num[j]*i;
    16             }
    17             for(int j = 1; j <= len; j++){
    18                 if(num[j]>9) {
    19                     num[j+1] += num[j]/10;
    20                     num[j] = num[j]%10;
    21                 }
    22                 if(num[len+1]!=0) len++;
    23             }
    24         }
    25         for(int i = len; i >= 1; i--) printf("%c",num[i]+'0');
    26         puts("");
    27     }
    28     return 0;
    29 }

    用大数的模板也可以,不过每次要吧数字转化成字符串,其实还是自己写比较简单,处理一个简单的进位就可以了

    下面是板子:

     1 void mult(char* A,char* B,char* ans)  
     2 {  
     3     int a[size+1]= {0};  
     4     int b[size+1]= {0};  
     5     int pa=0,pb=0;  
     6     int c[2*size+1]= {0};  
     7   
     8     int lena=strlen(A);  
     9     int lenb=strlen(B);  
    10   
    11     for(int i=lena-1; i>=0; i--)  
    12         a[pa++]=A[i]-'0';  
    13     for(int j=lenb-1; j>=0; j--)  
    14         b[pb++]=B[j]-'0';  
    15   
    16     for(pb=0; pb<lenb; pb++)  
    17     {  
    18         int w=0;  //低位到高位的进位  
    19         for(pa=0; pa<=lena; pa++)  
    20         {  
    21             int temp=a[pa]*b[pb]+w;  
    22             w=temp/10;  
    23             temp=(c[pa+pb]+=temp%10);  
    24             c[pa+pb]=temp%10;  
    25             w+=temp/10;  
    26         }  
    27     }  
    28     bool flag=false;  
    29     bool sign=false;  //标记ans是否为全0  
    30     for(pa=0,pb=lena+lenb-1; pb>=0; pb--)  
    31     {  
    32         if(!flag && c[pb]==0)  //删除ans开头的0  
    33             continue;  
    34         else  
    35             flag=true;  
    36   
    37         sign=true;  
    38         ans[pa++]=c[pb]+'0';  
    39     }  
    40     if(sign)  
    41         ans[pa]='';  
    42     else  
    43     {  
    44         ans[0]='0';  
    45         ans[1]='';  
    46     }  
    47   
    48     return;  
    49 }  
     1 string sum(string s1,string s2)  //大数加法  
     2 {  
     3     if(s1.length()<s2.length())  
     4     {  
     5         string temp=s1;  
     6         s1=s2;  
     7         s2=temp;  
     8     }  
     9     int i,j;  
    10     for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--)  
    11     {  
    12         s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0));   //注意细节  
    13         if(s1[i]-'0'>=10)  
    14         {  
    15             s1[i]=char((s1[i]-'0')%10+'0');  
    16             if(i) s1[i-1]++;  
    17             else s1='1'+s1;  
    18         }  
    19     }  
    20     return s1;  
    21 }  
    22   
    23 string Mult(string s,int x)  //大数乘以整形数  
    24 {  
    25     reverse(s.begin(),s.end());  
    26     int cmp=0;  
    27     for(int i=0;i<s.size();i++)  
    28     {  
    29         cmp=(s[i]-'0')*x+cmp;  
    30         s[i]=(cmp%10+'0');  
    31         cmp/=10;  
    32     }  
    33     while(cmp)  
    34     {  
    35         s+=(cmp%10+'0');  
    36         cmp/=10;  
    37     }  
    38     reverse(s.begin(),s.end());  
    39     return s;  
    40 }  
    41 string Multfa(string x,string y)  //大数乘法  
    42 {  
    43     string ans;  
    44     for(int i=y.size()-1,j=0;i>=0;i--,j++)  
    45     {  
    46         string tmp=Mult(x,y[i]-'0');  
    47         for(int k=0;k<j;k++)  
    48             tmp+='0';  
    49         ans=sum(ans,tmp);  
    50     }  
    51     return ans;  
    52 }  

    模板转自:http://blog.csdn.net/u012860063/article/details/36903491

  • 相关阅读:
    求逆序数 noj117
    背包问题 noj106
    士兵杀敌(二)
    Perl 日记模式操作(匹配与替换)
    Symbian中如何调试控制台程序
    Perl 日记references (often used)
    跨平台开发库(Symbian involved)日记1
    无法不想你,CLASSPATH,
    Symbian中不能跨越线程(RThread)使用的对象/组件(RSocket/Memery Heap,etc)
    几种设计模式分类的个人理解
  • 原文地址:https://www.cnblogs.com/shanyr/p/7365943.html
Copyright © 2011-2022 走看看