计数并获得小数点后的最大位数

时间:2015-01-08 19:17:02

标签: c++ arrays decimal

我想从c ++程序中得到的是从十进制数组中得到最高位数。 例如,在2.1和2.01之间,结果计数器应为2,因为在2.01之后有2位数。 有人可以帮我这个吗? (顺便说一下,我只是一个初学者,所以我想不出任何事情)

#include<conio.h>
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
    double z[100],x[100],sml;
    int count=0,i=0,n;
    cout<<"ENter number of elements\n";
    cin>>n;
    cout<<"Enter the numbers\n";
    for(i=0;i<n;i++)
    {
        cin>>z[i];
    }
    x[0]=z[0]-int(z[0]);
    i=0;
    for(i=0;i<n;i++)
    while(z[i]>=0.001&&i<n)
    {
        x[i]=z[i]-int(z[i]);
        i++;
    }
    for(i=0;i<n;i++)
    {
        cout<<x[i]<<"\t";
    }
    sml=x[0];
    for(i=0;i<n;i++)
        if(sml>x[i])
            sml=x[i];
    sml=sml-int(sml);
    while(sml>=0.001)
    {
        sml=sml*10;
        count++;
        sml=sml-int(sml);
    }
    cout<<endl<<count;
    return 0;
}

3 个答案:

答案 0 :(得分:1)

答案已被接受。但是只是为了好玩。这里是使用C ++算法的解决方案。

这将大大减少main中的语句数量。

也许它可以帮助您更好地理解现代C ++

#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
#include <vector>

inline size_t getNumberOfDigitsForFraction(const std::string& s)
{
    size_t positionOfDecimalPoint = s.find("."); // Look for decimal point 
    // And count the numbers of digits after the decimal point
    return positionOfDecimalPoint == std::string::npos ? 0 : s.substr(positionOfDecimalPoint+1).size();
}

int main()
{
    std::cout << "Enter the number of elements that you want to check:  ";
    size_t numberOfElementsToCheck{0}; 
    // Read how many data the user wants to process
    std::cin >> numberOfElementsToCheck;

    // Hier we will store the values    
    std::vector<std::string> elements(numberOfElementsToCheck); 
    // Copy all wanted values from std::cin
    std::copy_n(std::istream_iterator<std::string>(std::cin),numberOfElementsToCheck,elements.begin());

    // Get the Element with maximum digits and print the number of digits
    std::cout << "Max number of digits following decimal point:  " <<
        getNumberOfDigitsForFraction(
        *std::max_element(elements.begin(), elements.end(), 
        [](const std::string &sLeft, const std::string &sRight)
        { return getNumberOfDigitsForFraction(sLeft) < getNumberOfDigitsForFraction(sRight);} )) << '\n';

    return 0;
}

答案 1 :(得分:0)

这不是不可能的,实际上应该很容易。将其转换为字符串,从小数点开始获取结果的子字符串并计算结果。

为此您需要查找:

-casting 
-indexof
-substring

如果你试一试并且无法弄清楚评论,我会给你一些指导,但你应该先自己尝试一下。

编辑:

我没有看到尝试做我建议的事情,看起来你刚刚发布了你的代码。所以这里有一些伪代码供您使用:

string stringNum =  to_string(decimalNum);
int decimalPos = stringNum.find(".");
string newString = stringNum.substr(decimalPos);
int answer = newString.length();

我很好地为你解答,你需要弄清楚语法。

答案 2 :(得分:0)

继续使用它:

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main(){
float number[] = {1.234,5.64,2.001,7.11112,3.999};

int a,numAfterDecimal  = 0;
    for(a=0;a<sizeof(number)/sizeof(*number);a++){
        ostringstream buff;
        buff<<number[a];
        string numStr= buff.str();
        int pos = numStr.find(".");
        string floatStr = numStr.substr(pos+1);
        if(a == 0){
           numAfterDecimal = floatStr.length();
        }
        else if(floatStr.length() > numAfterDecimal){
           numAfterDecimal = floatStr.length();
        }
    }
cout << " higest number of digit after decimal is:"<< numAfterDecimal <<endl ;
}