zoukankan      html  css  js  c++  java
  • 大数开根

    模板1:对于长度为 n 的数,其算术平方根长度为 n/2(n 为偶数) 或 n/2+1(n 为奇数),然后从高位到低位枚举每位即可得出结果;

    代码:

     1 #include<iostream>
     2 #include<string>
     3 #include<string.h>
     4 using namespace std;
     5 
     6 const int MAXN = 1e3+10;
     7 string s;  //  n,m;
     8 int len;  //  记录开根号后大数的位数;
     9 
    10 int sqrts[MAXN];
    11 int a[MAXN], temp[MAXN], ans[MAXN];
    12 
    13 int compare(int a[], int b[], int len1, int len2){
    14     if(len1 > len2) return 1;
    15     else if(len1 < len2) return -1;
    16     for(int i=len1-1; i>=0; i--){
    17         if(a[i] > b[i]) return 1;
    18         else if(a[i] < b[i]) return -1;
    19     }
    20     return 0;
    21 }
    22 
    23 //  计算sqrta[]*sqrtb[],len1,len2分别为sqrta,sqrtb的长度;返回结果位数;
    24 int multi(int *ans, int A[], int B[], int len1, int len2){
    25     for(int i=0; i<=MAXN; i++) ans[i]=0;  //  对于传址ans,用memset没法初始化;
    26     for(int i=0; i<len1; i++){
    27         for(int j=0; j<len2; j++){
    28             ans[i+j] += A[i]*B[j];
    29         }
    30     }
    31     for(int i=0; i<len1+len2; i++){
    32         ans[i+1] += ans[i]/10;
    33         ans[i] %= 10;
    34     }
    35     int i;
    36     for(i=len1+len2; i>=0; i--){
    37         if(ans[i]) break;
    38     }
    39     return i+1;
    40 }
    41 
    42 //  将s开根号,保存在A(倒序存储)中,并且返回开根号后s的位数;
    43 int get_sqrt(int *A, string s){
    44     memset(A, 0, sizeof(A));
    45     memset(a, 0, sizeof(a));
    46     int len1 = s.size();
    47     int len2 = len1>>1;
    48     if(len1 & 1) len2 += 1;
    49     for(int i=0,j=s.size()-1; i<s.size(); i++,j--){ //翻转
    50         a[j]=s[i]-'0';
    51     }
    52     for(int i=len2-1; i>=0; i--){  //  从最高位开始试;
    53         int flag, lenMul=1;
    54         memset(temp, 0, sizeof(temp));
    55         while((flag=compare(temp, a, lenMul, len1))==-1){
    56             A[i]++;
    57             lenMul=multi(temp, A, A, len2, len2);
    58             for(int k=0; k<len2; k++){
    59                 cout << A[k];
    60             }
    61             cout << endl;
    62         }
    63         if(flag==0) break;
    64         else if(flag==1) A[i]--;
    65     }
    66     return len2;
    67 }
    68 
    69 int main(void){
    70     cin >> s;
    71     len = get_sqrt(sqrts, s);
    72     for(int i=len-1; i>=0; i--){
    73         cout << sqrts[i];
    74     }
    75     cout << endl;
    76     return 0;
    77 }
    View Code
  • 相关阅读:
    [CLK Framework] CLK.Settings
    [Architecture Design] CLK Architecture
    记一次 bug 修复 , 未将对象引用实例化
    Invoke 与 BeginInvoke 应用场景
    一次发布生产版程序异常排查总结
    C# 使用 SmtpClient 发送邮件注意项
    MSSql Server 批量插入数据优化
    Window Server 布署 WCF 服务 , 权限配置问题
    C++ 值类型和引用类型传递示例
    VS2015 C#调用C++ 托管代码无法调试问题排查
  • 原文地址:https://www.cnblogs.com/geloutingyu/p/6900479.html
Copyright © 2011-2022 走看看