https://wenda.so.com/q/1374009916066419
#include <math.h>
#include <malloc.h>
#include <memory.h>
#include <stdio.h>
typedef unsigned char U8;
typedef unsigned short U16;
typedef unsigned long U32;
#define LEN_QUEST 400 /* precision */
#define A 2 /* A^0.5 */
#define LEN (LEN_QUEST+1)
U32 InvMpy ( U32* a, U32 m, U32 n ) /* res = a(m)a(n) + a(m+1)a(n-1) + ... + a(n)a(m) */
{
U32 i;
U32 res;
if ( n < m )
return 0;
if ( n == m )
return ( a[m] * a[m] );
res = 0;
for ( i = 0; i <= n; i++ )
res += a[m + i] * a[n - i];
return res;
}
U32 Calc ( U32* res, U32 rest, U32 precision )
{
U32 tmp;
U32 max;
U32 isRight = 0;
rest = 10 * rest;
tmp = InvMpy ( res, 1, precision - 1 );
if ( tmp > rest )
return 0;
if ( precision > LEN && tmp != rest )
return 1;
max = ( rest - tmp ) >> 1;
if ( max > 9 )
max = 9;
for ( int i = max; i >= 0; i-- )
{
res[precision] = i;
tmp = InvMpy ( res, 0, precision );
if ( tmp > rest )
continue;
tmp = rest - tmp;
tmp = Calc ( res, tmp, precision + 1 );
if ( tmp != 0 )
{
isRight = 1;
break;
}
}
return isRight;
}
void main()
{
U32* res;
U32 rest;
res = ( U32* ) malloc ( 2 * sizeof( U32 ) * LEN );
memset ( res, 0xFF, 2 * sizeof( U32 ) * LEN );
res[0] = ( U32 )sqrt( 1.0L * A );
rest = A - res[0] * res[0];
Calc ( res, rest, 1 );
printf( "%d.", res[0] );
for ( U32 i = 1; i < LEN; i++ )
printf ( "%d", res[i] );
printf ( "\n" );
printf ( "The %dth is %d\n", LEN_QUEST, res[LEN_QUEST] );
free ( res );
}
https://bbs.csdn.net/topics/10300065
#include <stdio.h>
#include <string.h>
//常数W表示数据的总位数,D标是小数部分位数。
const int W = 301;
const int D = 300;
int pos( int power )
{
return power + D;
}
int power( int pos )
{
return pos - D;
}
void fill( int d[W], int t )
{
for ( int i = 0; i < W; i++ ) d[i] = t;
}
void copy( int x[W], int y[W] )
{
for ( int i = 0; i < W; i++ ) y[i] = x[i];
}
void assign( int x[W], char* n, char* d )
{
fill( x, 0 );
char* p;
p = n;
int L = strlen( n );
int i;
for ( i = L - 1; i >= 0; i--, p++ ) x[pos( i )] = *p - '0';
L = strlen( d );
p = d;
for ( i = -1; i >= -L; i--, p++ ) x[pos( i )] = *p - '0';
}
int equal( int x[W], int y[W] )
{
for ( int i = W - 1; i > 0; i-- )
if ( x[i] != y[i] ) return 0;
return 1;
}
void mid( int x[W], int y[W], int z[W] )
{
z[0] = x[0] + y[0];
for ( int i = 1; i < W; i++ )
{
z[i] = x[i] + y[i] + z[i - 1] / 10;
z[i - 1] = z[i - 1] % 10;
}
for ( int i = W - 1; i > 0; i-- )
{
z[i - 1] += ( z[i] * 10 ) % 20;
z[i] /= 2;
}
z[0] /= 2;
}
void sqr( int x[W], int y[W] )
{
fill( y, 0 );
for ( int i = 0; i < W; i++ )
{
for ( int j = 0; j < W; j++ )
{
int t = pos( power( i ) + power( j ) );
if ( ( t >= 0 ) && ( t < W ) ) y[t] += x[i] * x[j];
}
}
for ( int i = 0; i < W - 1; i++ )
{
y[i + 1] += y[i] / 10;
y[i] = y[i] % 10;
}
y[W - 1] = y[W - 1] % 10;
}
int compare( int x[W], int y[W] )
{
for ( int i = W - 1; i >= 0; i-- )
{
if ( x[i] < y[i] ) return -1;
if ( x[i] > y[i] ) return 1;
}
return 0;
}
void print( int x[W] )
{
int i;
for ( i = W - 1; i >= 0; i-- )
{
printf( "%c", '0' + x[i] );
if ( i == D ) printf( "." );
}
printf( "\n" );
}
void sqrt1( int x[W], int y[W] )
{
int a[W], b[W], c[W];
fill( a, 0 );
copy( x, b );
b[pos( 0 )]++;
while ( !equal( a, b ) )
{
mid( a, b, c );
sqr( c, y );
if ( compare( y, x ) < 0 ) copy( c, a );
else copy( c, b );
}
copy( c, y );
return;
}
void main()
{
int x[W], y[W];
assign( x, "2", "0" );
sqrt1( x, y );
print( y );
}
https://www.cnblogs.com/jumpkin1122/p/11575480.html
import numpy as np
from decimal import *
# 设置位数
n = int(input("请输入位数:"))
getcontext().prec = n+1
# 平方根
result = np.sqrt(Decimal(2))
# 数字转换成字符串并提取到最后一位
end = str(result)[-1:]
# 打印结果
print("平方根结果:", result)
print("小数点后总有数据:", len(str(result))-2)
print("小数点第{}位数:{}".format(n, end))
测试:第一段和第三段代码 最后两位数字不正确,第二段最后三个数字不正确。。。
都是高手,我看不懂。。。