大数 平方根

来源:互联网 发布:linux find exec 编辑:程序博客网 时间:2024/04/28 20:19

出处链接:大数平方根


先把 一些没有 成熟的代码 以及思路放在这里  

手动开根号的基本方法:1、整数开平方步骤:

(1)将被开方数从右向左每隔2位用撇号分开;

(2)从左边第一段求得算数平方根的第一位数字;

(3)从第一段减去这个第一位数字的平方,再把被开方数的第二段写下来,作为第一个余数;

(4)把所得的第一位数字乘以20,去除第一个余数,所得的商的整数部分作为试商(如果这个整数部分大于或等于10,就改用9左试商,如果第一个余数小于第一位数字乘以20的积,则得试商0);

(5)把第一位数字的20倍加上试商的和,乘以这个试商,如果所得的积大于余数时,就要把试商减1再试,直到积小于或等于余数为止,这个试商就是算数平方根的第二位数字; (6)用同样方法继续求算数平方根的其他各位数字。


#include <iostream>#include <cstring>#include <cstdio>using namespace std;void Sqrt(string s){    double i,r,n;    int j,l,size,num,x[1005];    size=s.length();    if(size==1&&s[0]=='0'){        cout<<0<<"\n";        return;    }    if(size%2){        n=s[0]-'0';        l=-1;    }    else{        n=(s[0]-'0')*10+s[1]-'0';        l=0;    }    r=0,num=0;    while(true){        i=0;        while(i*(i+20*r)<=n)            i++;        i--;        n-=i*(i+20*r);        r=r*10+i;        x[num]=(int)i;        num++;        l+=2;        if(l>=size)            break;        n=n*100+(double)(s[l]-'0')*10+(double)(s[l+1]-'0');    }    for(j=0;j<num;j++)        cout<<x[j];    cout<<"\n";}int main(){    string s;    while(cin>>s)        Sqrt(s);    return 0;}


0 0