zoukankan      html  css  js  c++  java
  • 称不上算法的算法-1.简单的高精度计算

    一、高精度加法

    基本

    HRBUST1550

     1 #include<stdio.h>
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<cstring>
     5 using namespace std;
     6 int a[110];
     7 int b[110];
     8 int main(void){
     9     int n;
    10     scanf("%d",&n);
    11     for(int l=0;l<n;l++){
    12         string s1;
    13         string s2;
    14         cin>>s1;//*********************************
    15         cin>>s2;//        char数组初始化读入
    16         memset(a,0,sizeof(a));//int数组归0化读入
    17         memset(b,0,sizeof(b));//*******************
    18         a[0]=s1.length();//长度
    19         b[0]=s2.length();//长度
    20         for(int i=1;i<=a[0];i++)//****************
    21             a[i]=s1[a[0]-i]-'0';//倒叙存入数组
    22         for(int i=1;i<=b[0];i++;23             b[i]=s2[b[0]-i]-'0';//****************
    24         int k=a[0]>=b[0]?a[0]:b[0];//求出和的预测位数
    25         for(int i=1;i<=k;i++){//******************
    26             a[i+1]+=(a[i]+b[i])/10;
    27             a[i]=(a[i]+b[i])%10;//核心计算
    28         }//***************************************
    29         if(a[k+1]!=0)
    30             k++;
    31         for(int j=k;j>0;j--)
    32             cout<<a[j];
    33         cout<<endl;
    34     }
    35 }

    变种(20进制) 

    HRBUST1624

     1 #include<cstring>
     2 #include<iostream>
     3 #include<stdio.h>
     4 int a[210];
     5 int b[210];
     6 using namespace std;
     7 int main(void){
     8     string s1;
     9     string s2;
    10     while(cin>>s1){
    11         cin>>s2;
    12         memset(a,0,sizeof(a));
    13         memset(b,0,sizeof(b));
    14         int nla=0;
    15         while(s1[nla]=='A')
    16             nla++;
    17         int nlb=0;
    18         while(s2[nlb]=='A')
    19             nlb++;
    20         a[0]=s1.length()-nla;
    21         b[0]=s2.length()-nlb;
    22         for(int i=1;i<=s1.length();i++)
    23             a[i]=s1[s1.length()-i]-'A';
    24         for(int i=1;i<=s2.length();i++)
    25             b[i]=s2[s2.length()-i]-'A';
    26         int k=a[0]>=b[0]?a[0]:b[0];
    27         for(int i=1;i<=k;i++){
    28             a[i+1]+=(a[i]+b[i])/20;
    29             a[i]=(a[i]+b[i])%20;
    30         }
    31         if(a[k+1] !=0)
    32             k++;
    33         for(int j=k;j>0;j--)
    34             printf("%c",a[j]+'A');
    35         cout<<endl;
    36     }
    37 }

     应用1-大斐波数

    HDU1715

     1 #include<stdio.h>
     2 #include<cstring>
     3 using namespace std;
     4 int a[2000];
     5 int b[2000];
     6 int c[2000];
     7 void addfun(int x[],int y[],int z[]);
     8 int main(void){
     9     int n;
    10     scanf("%d",&n);
    11     for(int t=0;t<n;t++){
    12         int k;
    13         scanf("%d",&k);
    14         if(k==1||k==2){
    15             printf("1
    ");
    16             continue;
    17         }
    18         else{
    19             memset(a,0,sizeof(a));
    20             memset(b,0,sizeof(b));
    21             memset(c,0,sizeof(c));
    22             b[0]=b[1]=c[0]=c[1]=1;
    23             int tim=1;
    24             for(int s=3;s<=k;s++){
    25                 if(tim==1)
    26                     addfun(b,c,a);
    27                 else if(tim==2)
    28                     addfun(a,b,c);
    29                 else
    30                     addfun(c,a,b);
    31                 tim++;
    32                 if(tim == 4)
    33                     tim=1;
    34             }
    35             if(tim==2){
    36                 for(int ll=a[0];ll>0;ll--)
    37                     printf("%d",a[ll]);
    38                 printf("
    ");
    39             }
    40             else if(tim==3){
    41                 for(int ll=c[0];ll>0;ll--)
    42                     printf("%d",c[ll]);
    43                 printf("
    ");
    44             }
    45             else{
    46                 for(int ll=b[0];ll>0;ll--)
    47                     printf("%d",b[ll]);
    48                 printf("
    ");
    49             }
    50         }
    51     }
    52 }
    53 void addfun(int x[],int y[],int z[]){
    54     memset(z,0,sizeof(z));
    55     z[0]=x[0]>=y[0]?x[0]:y[0];
    56     for(int i=1;i<=z[0];i++){
    57         y[i+1]+=(x[i]+y[i])/10;
    58         z[i]=(x[i]+y[i])%10;
    59     }
    60     if(y[z[0]+1] != 0){
    61         z[0]++;
    62         z[z[0]]=y[z[0]];
    63     }
    64 }

    计算时进位应参加下一位的运算,在原数列中保存结果时直接加到下一位,而在新数列中保存结果时易忽略这一点,所以应该把进位加进下一位加数之中。

    HDU1715需要保留一个加数,所以把进位加进准备要牺牲的那个数列中(即f(n-2))。

    二、高精度乘法(高精度与高精度)

     1 #include<stdio.h>
     2 #include<iostream>
     3 #include<cstring>
     4 int a[1005];
     5 int b[1005];
     6 int c[2010];
     7 using namespace std;
     8 int main(void){
     9     string s1;
    10     string s2;
    11     while(cin>>s1){
    12         cin>>s2;
    13         if(s1[0]=='0' || s2[0]=='0'){
    14             cout<<0<<endl;
    15             continue;
    16         }
    17         memset(a,0,sizeof(a));
    18         memset(b,0,sizeof(b));
    19         memset(c,0,sizeof(c));
    20         int la=s1.length();
    21         int lb=s2.length();
    22         for(int i=0;i<la;i++)
    23             a[i]=s1[la-i-1]-'0';
    24         for(int i=0;i<lb;i++)
    25             b[i]=s2[lb-i-1]-'0';
    26         int lc=la+lb;
    27         for(int i=0;i<la;i++){
    28             for(int j=0;j<lb;j++){
    29                 c[i+j]+=a[i]*b[j];
    30                 c[i+j+1]+=c[i+j]/10;
    31                 c[i+j]=c[i+j]%10;
    32             }
    33         }
    34         
    35         if(c[lc-1]==0)
    36             lc--;
    37         for(int ll=lc-1;ll>=0;ll--)
    38             cout<<c[ll];
    39          
    40         cout<<endl;
    41     }
    42 }
  • 相关阅读:
    opencv.js小项目demo
    face-api.js 前端人脸识别,人脸检测,登录认证
    note.js 引用jQuery,
    note.js使用express创建项目的步骤以及ip和端口配置
    学习kettle遇到的问题
    Linux 后台执行python或者java代码的命令
    kettle入门大数据管理工具
    java保留2位或n位小数
    快速排序基本思想,递归写法,python和java编写快速排序
    学了一天的golang从入门到放弃
  • 原文地址:https://www.cnblogs.com/liuzey/p/8810566.html
Copyright © 2011-2022 走看看