一个数列计算的cpp

是的,只有开始动手,才会发现自己有多菜。

请叫我小白菜~~~~

题目:

被要求每周六道题,好吧,今天的第一道是求数列和,1+1/2!+1/3!+...+1/n!

要求输入n, 输出表达式及和。

string、int、float间转换:

看上去简单,嗯,两个方法,两个循环,搞定。

结果一写,string和int , double之间的转换给忘了。

╮(╯_╰)╭,找到了两种。

第一种:

#include<sstream>

ostringstream os;
os<<i;
return i.str();

这种是利用sstream的string流转换。

第二种:

#include<stdio.h>

float f=1.23244;
char* ch=new char[1024];
sprintf(ch,"%f",f);
这种是利用c函数将float存入char数组中。


数组指针传递:

好了,转换搞定,开始写循环之类的,这些都是小菜~~

问题又来了,函数规定为输入n和char * ,返回值为空,直接在函数里面修改char数组的值~~

void getResult(int input, char * result){
    ...
   result = const_cast<char *>(str.c_str());
}
这样写,根本就不会改变主函数里面result数组的值,并且通过cout<<&result 的值,发现函数中和函数外的两个地址不一致!

好吧,换成 char ** result ,然后赋值的时候, *result = str.c_str(); 就可以改变其值了。

double精度:

最后一虐,double的精度问题。

从1-8的值都是正常的,到了9开始就发现所有的答案都一致,这肯定是有问题的。

然后跟踪,定位,发现是double的精度改变了。

起初的想法是,肯定是cout的问题~~~(太天真了,有木有)

所以我找到了如下方法,在控制台上打印出了正确的值。

#include<iomanip>

cout<<std::fixed;
cout<<setprecision(16)<<d<<endl;
但是,但是,函数里面的值还是没有变,double在传值的时候就已经损失了精度了。

所以,这里必须用sprintf函数来转换double。

由于double是8位的,所以正负16位,sprintf(chs,"%.16f",d);

空指针异常:

到了最后,发现老是异常退出,控制台返回的错误码是0xc00005,百度之后发现这个是空指针异常。

结果发现char * ch=new char[1024]; 是需要new 空间的,不然会报空指针。

总的cpp:

#include<iostream>
#include<string>
#include<sstream>
#include<iomanip>
#include<stdio.h>
using namespace std;


string itos(int i){
    ostringstream os;
    os<<i;
    return os.str();
}

string dtos(double d){
    ostringstream os;
    os<<d;
    cout<<"double : "<<d<<" string: "<<os.str()<<endl;
    return os.str();

}

long fact(int n){
    long sum;
    sum=1;
    for(int i=1;i<=n;i++){
        sum*=i;
    }
    return sum;
}

void getResult(int input,char** result){
    string str="";
    double sum=0.0;
    char* chs=new char[1024];
    for(int i=1;i<=input;i++){
        if(i==1){
            str+="1";
        }else{
            str+="1/";

            sprintf(chs,"%d",i);
            str+=chs;
        }

        if(i==input){
            str+="=";
        }else{
            str+="+";
        }

        double f=(double)fact(i);
        cout<<"fact "<<f<<endl;
        sum+=1.0/f;

        cout<<" sum: "<<sum<<endl;
    }
    char *s=new char[1024];
    sprintf(s,"%.16f",sum);
    str+=s;
    *result=const_cast<char *>(str.c_str());
}

int main(){
    int input=10;
    char * res=new char[1024];
    res="";
    getResult(input,&res);
    cout<<"finally: "<<res<<endl;
    delete []res;
    cout<<"----------"<<endl;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值