(转)计算2的平方根,并输出小数点后N位

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))

测试:第一段和第三段代码 最后两位数字不正确,第二段最后三个数字不正确。。。

都是高手,我看不懂。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值