平方根代码C 无SQRT()

Square Root Code C++ without sqrt()

本文关键字:SQRT 代码 平方根      更新时间:2023-10-16

我必须创建一个代码,其中用户输入一个是一个完美正方形的数字,我必须显示其根。我已经制作了此代码,但是在此文章中,我得到了Segmentation Fault 11int j = squareRootVector[i]; squareRoot.push_back(j);。我不能太多更改代码,所以有办法可以做到吗?

#include <iostream>
#include <vector>
using namespace std;

int main() {
cout <<
 "Enter the number:n";
    int input;
    int number = input;
    int divider = 2;
    vector<int> squareRootVector;
    vector<int> squareRoot;
    cin >> number;
    for(int divider = 2; number > 1; divider++) {
        while((number % divider) == 0) {
            number /= divider;
            cout << number << endl;
            squareRootVector.push_back(divider); 
        }
    }

    for(int i = 0; i < squareRootVector.size(); i++) {
        cout << squareRootVector[i] << " ";
        /*******PROBLEM*******/
        if(squareRootVector[i] == squareRootVector[i+1]) {
            int j = squareRootVector[i];
            squareRoot.push_back(j);
        }
        /*********************/
    }
    int root;
    for (int i = 0; squareRoot.size(); i++) {
        root = root * squareRoot[i];
    }
    cout << "Square Root of " << input << " is: " << root << endl;

    return 0;
}

使用i访问squareRootVector[i+1]的行为仅在size下方一个(您的循环constaint允许)是 und> undefined 。。

考虑写作

for (std::size_t i = 1; i < squareRootVector.size(); i++) {

相反,并相应地重新列出for循环主体。我还滑过了i的类型更改。

很快,问题是最后一个" for":

中的最后一个周期
for(int i = 0; i < squareRootVector.size(); i++)

中有以下行:

squareRootVector[i] == squareRootVector[i+1];

这是一个"限制"错误:squareRootVector仅具有squareRootVector.size()元素(例如n),并且这些元素从0索引到n-1

squareRootVector[i+1]在最后一个周期中点一个元素 squareRootVector的最后一个,它是未定义的行为。

使用vector :: iterator是正确的方式。

for(vector<int>::iterator it = squareRootVector.begin(); it != squareRootVector.end(); ++it)
{
    if( (it+1) == squareRootVector.end() )
    {
        //what to do if there's no next member???
        break;
    }
    if( *it == *(it+1) )
    {
        squareRoot.push_back(*it);
    }
} 

感谢您的回答,伙计们。我最终得到了此代码:

#include <iostream>
#include <vector>
using namespace std;

int main() {
cout << "Enter the number:n";
int input = 0;
int number = 0;
cin >> input;
number = input;
int divider = 2;
vector<int> squareRootVector;
vector<int> squareRoot;

for(int divider = 2; number > 1; divider++) {
    while((number % divider) == 0) {
        number /= divider;
        squareRootVector.push_back(divider); 
    }
}
int vectorSize = squareRootVector.size() - 1;

for(int i = 0; i < vectorSize; i++) {
    if(squareRootVector[i] == squareRootVector[i+1]) {
        int j = squareRootVector[i];
        squareRoot.push_back(j);
    }
}
int root = 1;
for (int i = 0; i < squareRoot.size(); i++) {
    root = root * squareRoot[i];
}
cout << "Square Root of " << input << " is " << root << endl;

return 0;
}