CPP开方


#include "mySqrt.hpp"
#include <iostream>
#include <string>
#include <assert.h>

using namespace std;

int *mySqrt(double, int max = 150);
double mySqrt1(double num, int max);

int main()
{

    int num;
    cout << "输入一个数:";
    cin >> num;
    int i = 1;
    int *a = mySqrt(num);
    cout << "√(" << num << ") = " << a[0];
    if (a[i] != -1)
    {
        cout << ".";
    }
    while (a[i] != -1)
    {
        cout << a[i];
        i++;
    }
    cout << endl;

    // system("pause");

    return 0;
    // cout << mySqrt(25) << endl;
}

/*
 num:需要开方的数字
 max:精确到多少位
 */
int *mySqrt(double num, int max)
{
    int *a = new int[max];
    /*for (int w = 0; w < max; w++) {
        a[w] = 0.0;
    }*/
    assert(num > 0);
    int i = 1;
    int d = 1;
    double divisor;  // 除数
                     // int divisor_Next; // 传给下一个后
    double dividend; // 被除数
    double down;     // 下边的数
    double trading;  // 商
                     // double finalTrad;

    while (i * i < num)
    {
        trading = i;
        i++;
    }

    if (i * i == num)
    {
        a[0] = i;
        a[1] = -1;
        return a;
    }
    else
    {
        a[0] = (i - 1);
    }

    // cout << trading << endl;
    dividend = num - (i - 1) * (i - 1);
    // cout << dividend << endl;
    divisor = trading * 20;
    // cout << divisor << endl; //40
    for (int j = 0; j < max; j++)
    {
        int k = 0;
        for (k = 0; k <= 9; k++)
        {
            if ((divisor + k) * k >= dividend * 100)
            {
                //cout << (k - 1) << " ";

                break;
            }
        }
        a[d] = k - 1;
        //cout << a[d] << " ";
        // cout << "k" << k << endl;
        dividend *= 100; // 除的数字 300 上边的数字
        down = (divisor + (k - 1)) * (k - 1);
        dividend = dividend - down;
        // cout << "下边" << dividend << endl;
        // cout << "下" << xia << endl;
        // cout << dividend << endl;
        trading = trading * 10 + (k - 1); // 最上边的最后的得数
        // cout << trading << endl;
        // cout << j << endl;
        divisor = trading * 20; // 左边的数
        d++;
    }
    // cout << d << endl;
    // while ((d - 1) > 0)
    // {
    //     trading /= 10.0;
    //     d--;
    // }
    // return trading;
    a[d - 1] = -1;

    return a;

    // cout << "   " << divisor;
}

double mySqrt1(double num, int max)
{
    // assert(num > 0);
    int i = 1;
    int d = 1;
    double divisor; // 除数
    // int divisor_Next; // 传给下一个后
    double dividend; // 被除数
    double down;     // 下边的数
    double trading;  // 商
    // double finalTrad;

    while (i * i < num)
    {
        trading = i;
        i++;
        if (i * i == num)
        {
            return i;
        }
    }
    // cout << trading << endl;
    dividend = num - (i - 1) * (i - 1);
    // cout << dividend << endl;
    divisor = trading * 20;
    // cout << divisor << endl; //40
    for (int j = 0; j < max; j++)
    {
        int k = 0;
        for (k = 0; k <= 9; k++)
        {
            if ((divisor + k) * k >= dividend * 100)
            {
                break;
            }
        }
        // cout << "k" << k << endl;
        dividend *= 100; // 除的数字 300 上边的数字
        down = (divisor + (k - 1)) * (k - 1);
        dividend = dividend - down;
        // cout << "下边" << dividend << endl;
        // cout << "下" << xia << endl;
        // cout << dividend << endl;
        trading = trading * 10 + (k - 1); // 最上边的最后的得数
        // cout << trading << endl;
        // cout << j << endl;
        divisor = trading * 20; // 左边的数
        d++;
    }

    while ((d - 1) > 0)
    {
        trading /= 10.0;
        d--;
    }
    return trading;

    // cout << "   " << divisor;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值