ACM模板 - C++大数问题 (转载+自整理)

以下代码均为网上整理 资料来源网络

<---- 目录在左侧边 自动生成的

1.大数的加法

      语法:add(char a[],char b[],char s[]);

      参数:

      a[]:被加数,用字符串表示,位数不限

      b[]:加数,用字符串表示,位数不限

      s[]:结果,用字符串表示

      返回值:null

      注意: 

      空间复杂度为 o(n^2)

      需要 string.h

      源程序: 

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

      {

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

          char *c;

          if (strlen(a)>strlen(b)) l=strlen(a)+2; else l=strlen(b)+2;

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

          i=strlen(a)-1;

          j=strlen(b)-1;

          k=0;up=0;

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

              {

                  if(i<0) x='0'; else x=a[i];

                  if(j<0) y='0'; else y=b[j];

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

                  if(up) z+=1;

                  if(z>9) {up=1;z%=10;} else up=0;

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

                  i--;j--;

              }

          if(up) c[k++]='1';

          i=0;

          c[k]='\0';

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

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

          back[i]='\0';

      } 

2.大数的减法 (未处理负数情况)

     语法:sub(char s1[],char s2[],char t[]);

     参数:

      s1[]:被减数,用字符串表示,位数不限

      s2[]:减数,用字符串表示,位数不限

      t[]:结果,用字符串表示

      返回值:null

      注意: 

      默认s1>=s2,程序未处理负数情况

     需要 string.h

     源程序:

     

 void sub(char s1[],char s2[],char t[])
      {
          int i,l2,l1,k;
          l2=strlen(s2);l1=strlen(s1);
          t[l1]='\0';l1--;
          for (i=l2-1;i>=0;i--,l1--)
              {
              if (s1[l1]-s2[i]>=0) 
                  t[l1]=s1[l1]-s2[i]+'0';
              else
                  {
                  t[l1]=10+s1[l1]-s2[i]+'0';
                  s1[l1-1]=s1[l1-1]-1;
                  }
              }
          k=l1;
          while(s1[k]<0) {s1[k]+=10;s1[k-1]-=1;k--;}
          while(l1>=0) {t[l1]=s1[l1];l1--;}
      loop:
          if (t[0]=='0') 
              {
              l1=strlen(s1);
              for (i=0;i<l1-1;i++) t[i]=t[i+1];
              t[l1-1]='\0';
              goto loop;
              }
          if (strlen(t)==0) {t[0]='0';t[1]='\0';}
      } 

3.大数的乘法  ---大数乘小数

      语法:mult(char c[],char t[],int m);

      参数:

      c[]:被乘数,用字符串表示,位数不限

       t[]:结果,用字符串表示 

      m:乘数,限定10以内

      返回值:null

      注意: 

      需要 string.h

      源程序: 

void mult(char c[],char t[],int m)
      {
          int i,l,k,flag,add=0;
          char s[100];
          l=strlen(c);
          for (i=0;i<l;i++)
              s[l-i-1]=c[i]-'0'; 
          for (i=0;i<l;i++)
                 {
                 k=s[i]*m+add;
                 if (k>=10) {s[i]=k%10;add=k/10;flag=1;} else 
      {s[i]=k;flag=0;add=0;}
                 }
          if (flag) {l=i+1;s[i]=add;} else l=i;
          for (i=0;i<l;i++)
              t[l-1-i]=s[i]+'0';
          t[l]='\0';
      }

4.大数的乘法  ---大数乘大数

  语法:mult(char a[],char b[],char s[]);

     参数:

      a[]:被乘数,用字符串表示,位数不限

      b[]:乘数,用字符串表示,位数不限

      t[]:结果,用字符串表示

      返回值:null

      注意: 

       空间复杂度为 o(n^2)

       需要 string.h

      源程序: 

void mult(char a[],char b[],char s[])
      {
          int i,j,k=0,alen,blen,sum=0,res[65][65]={0},flag=0;
          char result[65];
          alen=strlen(a);blen=strlen(b); 
          for (i=0;i<alen;i++)
          for (j=0;j<blen;j++) res[i][j]=(a[i]-'0')*(b[j]-'0');
          for (i=alen-1;i>=0;i--)
              {
                  for (j=blen-1;j>=0;j--) sum=sum+res[i+blen-j-1][j];
                  result[k]=sum%10;
                  k=k+1;
                  sum=sum/10;
              }
          for (i=blen-2;i>=0;i--)
              {
                  for (j=0;j<=i;j++) sum=sum+res[i-j][j];
                  result[k]=sum%10;
                  k=k+1;
                  sum=sum/10;
              }
          if (sum!=0) {result[k]=sum;k=k+1;}
          for (i=0;i<k;i++) result[i]+='0';
          for (i=k-1;i>=0;i--) s[i]=result[k-1-i];
          s[k]='\0';
          while(1)
              {
              if (strlen(s)!=strlen(a)&&s[0]=='0') 
                  strcpy(s,s+1);
              else
                  break;
              }
      }

5.大数的阶乘

      语法:int result=factorial(int n);

      参数:

      nn 的阶乘

      返回值:阶乘结果的位数

      注意: 

       本程序直接输出n!的结果,需要返回结果请保留long a[]

      需要 math.h

      源程序: 

int factorial(int n)
      {
      long a[10000];
      int i,j,l,c,m=0,w; 
      a[0]=1; 
      for(i=1;i<=n;i++)
          { 
          c=0; 
          for(j=0;j<=m;j++)
              { 
              a[j]=a[j]*i+c; 
              c=a[j]/10000; 
              a[j]=a[j]%10000; 
          } 
          if(c>0) {m++;a[m]=c;} 
      } 

      w=m*4+log10(a[m])+1;
      printf("\n%ld",a[m]); 
      for(i=m-1;i>=0;i--) printf("%4.4ld",a[i]);
      return w;
      } 

6.大数的比较

       语法:int compare(char a[],char b[]);

      参数: 

      a[]:被比较数,用字符串表示,位数不限

      b[]:比较数,用字符串表示,位数不限

      返回值: 0    a<b

                  1    a>b

                  2    a=b

      源程序: 

int compare(char a[], char b[])  
{  
    int lena=strlen(a);  
    int lenb=strlen(b);  
    if(lena>lenb)  
        return 1;  
    else if(lena<lenb)  
        return 0;  
    for(int i=0;i<lena;i++)  
    {  
        if(a[i]>b[i])  
            return 1;  
        else if(a[i]<b[i])  
            return 0;  
    }  
    return 2;  
}  
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ACM-ICPC(国际大学生程序设计竞赛)是一项面向大学生的计算机编程竞赛,涉及算法和数据结构等领域。在比赛中,选手需要解决一系列编程问题,使用合适的算法和数据结构来实现正确和高效的解决方案。 对于整理ACM-ICPC模板,以下是一些建议: 1. 了解比赛要求:首先,你需要了解ACM-ICPC比赛的具体要求和规则。这包括了解比赛所涉及的算法和数据结构,以及题目的类型和难度等。 2. 收集资料:收集与ACM-ICPC相关的资料,包括经典算法和数据结构的实现代码、常见问题的解题思路等。可以参考教材、博客、论文等资源。 3. 整理模板:将收集到的资料整理模板。可以按照算法和数据结构的分类进行整理,例如排序算法、图算法、字符串算法等。对每个模板,添加必要的注释和示例代码,以便理解和使用。 4. 测试代码:对每个模板编写测试代码,确保它们的正确性和可靠性。可以使用已知的测试用例或自行设计测试用例。 5. 更新与扩充:定期更新和扩充模板,以适应ACM-ICPC比赛中新出现的算法和数据结构。同时,根据自己的经验和理解,对模板进行优化和改进。 6. 练习和复习:在比赛之前,利用整理好的模板进行练习和复习。尝试解决一些经典问题,使用模板中的算法和数据结构进行实现,并进行优化。 希望这些建议对你整理ACM-ICPC模板有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值