zoukankan      html  css  js  c++  java
  • 【个人模板】高精度算法

    一、求两个高精度正数的和差积

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<cmath>
      5 using namespace std;
      6 const int MAXN=1000;
      7 char s1[MAXN],s2[MAXN];
      8 int ed1,ed2,n1,n2;
      9 int num1[MAXN];
     10 int num2[MAXN];
     11 int ans[MAXN];
     12 
     13 void input()
     14 {
     15     scanf("%s%s",s1,s2);
     16     ed1=strlen(s1)-1;
     17     ed2=strlen(s2)-1;
     18 }
     19 
     20 void switchnum()//把字符转换为数字 
     21 {
     22     memset(num1,0,sizeof(num1));
     23     memset(num2,0,sizeof(num2));
     24     for (int i=ed1;i>=0;i--) num1[ed1-i]=s1[i]-'0';
     25     for (int i=ed2;i>=0;i--) num2[ed2-i]=s2[i]-'0';
     26 }
     27 
     28 void add()
     29 {
     30     memset(ans,0,sizeof(ans));
     31     int ed=max(ed1,ed2),carry=0;
     32     for (int k=0;k<=ed;k++)
     33     {
     34         ans[k]=num1[k]+num2[k]+carry;
     35         carry=ans[k]/10;
     36         ans[k]=ans[k]%10;
     37     }
     38     if (carry>0) 
     39     {
     40         ed++;
     41         ans[ed]=carry;
     42     }
     43     for (int k=ed;k>=0;k--) cout<<ans[k];cout<<endl;
     44 } 
     45 
     46 void sub()
     47 {
     48 /*strcmp是字符串比较函数,作用是比较字符串1和字符串2
     49 如:strcmp(str1,str2);
     50   strcmp("china","korea");
     51 比较的结果由函数带回。
     52 (1)如果字符串1=字符串2,函数值为0。
     53 (2)如果字符串1〉字符串2,函数值为一正整数
     54 (3)如果字符串1<字符串2,函数值为一负整数*/ 
     55     memset(ans,0,sizeof(ans));
     56     int ed=max(ed1,ed2),f;
     57     if (ed1==ed2) f=strcmp(s1,s2); //这里不能写成(ed1=ed2),否则会赋值 
     58         else{
     59             if (ed1>ed2) f=1;
     60             else f=-1;
     61         }
     62     for (int k=0;k<=ed;k++)
     63     {
     64         if (f>=0) ans[k]+=num1[k]-num2[k];
     65         else ans[k]+=num2[k]-num1[k];
     66         if (ans[k]<0)
     67         {
     68             ans[k]+=10;
     69             ans[k+1]--;
     70         }
     71     }
     72     if (0==ans[ed]) ed--; //这里不能写成ans[ed]=0,否则会进行赋值 
     73     for (int k=ed;k>=0;k--) cout<<ans[k];cout<<endl;
     74 }
     75 
     76 void mul()
     77 {
     78     memset(ans,0,sizeof(ans));
     79     int ed=ed1+ed2;
     80     for (int i=0;i<=ed1;i++)
     81         for (int j=0;j<=ed2;j++)
     82         {
     83             ans[i+j]+=num1[i]*num2[j];
     84             if (i+j>0)
     85             {
     86                 ans[i+j]+=ans[i+j-1]/10;
     87                 ans[i+j-1]%=10;
     88             } 
     89         }
     90     if (ans[ed]>9)
     91     {
     92         ed++;
     93         ans[ed]=ans[ed-1]/10;
     94         ans[ed-1]%=10; 
     95     }  
     96     for (int k=ed;k>=0;k--) 
     97     {
     98         cout<<ans[k];
     99     }
    100     cout<<endl;
    101 }
    102 
    103 int main()
    104 {
    105     input();
    106     switchnum();
    107     add();
    108     sub();
    109     mul();
    110     return 0;
    111 } 

    二、求一个高精度正数和一个低精度正数的商和余数

     1 #include<iostream>
     2 #include<cstring> 
     3 #include<cstdio>
     4 using namespace std;
     5 const int MAXN=1000;
     6 char a[MAXN];
     7 int num[MAXN];
     8 int b,rem;
     9 
    10 int main()
    11 {
    12     scanf("%s%d",a,&b);
    13     for (int i=0;i<strlen(a);i++) num[i]=a[i]-'0';
    14     rem=0; 
    15     bool f=false;
    16     for (int i=0;i<strlen(a);i++)
    17     {
    18         rem=rem*10+num[i];
    19         if (rem>b) f=true;
    20         if (f) cout<<rem/b;
    21         rem%=b;
    22     }
    23     cout<<endl;
    24     if (rem!=0) cout<<rem<<endl;
    25     return 0; 
    26 }
  • 相关阅读:
    微信小程序路由跳转方式
    事务的隔离级别 乐观锁和悲观锁 f查询 q查询
    手机短信验证
    用git来操作项目
    git使用
    redis数据库 Python使用redis
    DRF框架:接口 ,restfui接口规范,基于restful规范的原生Django接口,Postman接口工具
    vue初识
    Win10玩游戏时听歌音量忽大忽小
    ASP.NET Core 2.0 WebApi全局配置及日志
  • 原文地址:https://www.cnblogs.com/iiyiyi/p/4617136.html
Copyright © 2011-2022 走看看