打印1到最大的n位数——12

本文介绍了一种使用字符串而非传统数值类型来打印从1到最大n位十进制数的方法,解决了当n值过大导致溢出的问题。通过双指针技巧实现数字递增与进位操作,最终成功打印所有目标数字。

    输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3...一直到最大的3位数即999。

    

    其实一看这个题,就可以想到用一个循环来打印,循环次数就为10的n次方减一,即输入3循环999次依次打印出所对应的值。但是,有一个重要的点就是,如果n的值很大,大到溢出了所能表示的最大整型范围的值,比如用long long数据类型都存放不下了要怎么办呢?这就可以考虑,用字符串的形式来表达大数据,反正只是说让打印出来;

程序设计如下:

#include <iostream>#include <string.h>using namespace std;void PrintMaxNNum(size_t n){    char *num = new char[n+1];//最后一个字符存放'\0'    char* tmp = num;    while(tmp < num+n)//初始化字符串将其全部设置为0    {           *tmp = '0';        ++tmp;    }       *(tmp--) = '\0';//使tmp指向最后一个有效字符    char *cur = tmp;        while(cur >= num)    {           while(*tmp < '9')//tmp始终在最后一位进行加1并输出        {            ++(*tmp);            cout<<cur<<" ";        }        *tmp = '0';//当循环结束时tmp恢复为0并且要向高位进位        for(int i = 1; cur >= num; ++i)//用循环来完成在cur到tmp的期间字符表示数字的进位        {            if((tmp-i) < cur)//当要进的位数不够当前cur所能表示的范围时将cur范围扩大                --cur;            if(cur >= num)            {                ++(*(tmp-i));//进位                if(*(tmp-i) <= '9')//若进位后不需要再向前进位,则输出并break重新回到最低位                {                    cout<<cur<<" ";                    break;                }                else//否则向再高位依次进位                {                    *(tmp-i) = '0';                    continue;                }            }        }    }    cout<<endl;    delete[] num;}int main(){    size_t n = 3;    PrintMaxNNum(n);    return 0;}


初步的思想就是用两个指针表示数字的范围,一个tmp指针始终处在最低位加1,当需要进位时不停地往cur的方向进位,直到cur超出字符串的范围;

运行程序:

wKiom1cxqFmA-hUSAAA_lAZwplY159.png

这数字已经够密密麻麻的了,如果设置再大一些比如超出系统数据类型所能表示范围的位数,运算都要耗费些时间,这里就不设置验证了。



《完》

本文出自 “敲完代码好睡觉zzz” 博客,请务必保留此出处http://2627lounuo.blog.51cto.com/10696599/1771883

位数回归是一种回归分析方法,可以用于探究自变量对因变量不同分位数的影响。在C++中,可以通过面向对象编程的方式来实现分位数回归模型。下面是一个简单的实现及案例。 1. 定义类 首先,我们需要定义一个类来表示分位数回归模型。这个类中应该包括以下成员变量和成员函数: - 成员变量:自变量和因变量的向量,以及一个表示分位数的 double 类型变量。 - 成员函数:读取数据、拟合模型、预测、计算残差等。 下面是这个类的定义: ``` #include <vector> class QuantileRegression { public: QuantileRegression(double tau) : tau(tau) {} void readData(const std::vector<double>& x, const std::vector<double>& y); void fitModel(); double predict(double x); std::vector<double> getResiduals(); private: std::vector<double> x; std::vector<double> y; double tau; std::vector<double> residuals; double slope; double intercept; void computeResiduals(); }; ``` 2. 实现成员函数 接下来,我们需要实现这个类中的成员函数。首先是读取数据的函数: ``` void QuantileRegression::readData(const std::vector<double>& x, const std::vector<double>& y) { this->x = x; this->y = y; } ``` 然后是拟合模型的函数。这里我们使用梯度下降算法来求解最小二乘回归问题,以便得到斜率和截距。在每一步迭代中,我们需要计算残差和梯度,以更新参数: ``` void QuantileRegression::fitModel() { int n = x.size(); double learning_rate = 0.1; int num_iterations = 1000; slope = 0.0; intercept = 0.0; for (int i = 0; i < num_iterations; i++) { computeResiduals(); double sum_resid = 0.0; double sum_xresid = 0.0; for (int j = 0; j < n; j++) { if (residuals[j] >= 0) { sum_resid += (1 - tau) * residuals[j]; sum_xresid += (1 - tau) * residuals[j] * x[j]; } else { sum_resid += tau * residuals[j]; sum_xresid += tau * residuals[j] * x[j]; } } double grad_slope = sum_xresid / n; double grad_intercept = sum_resid / n; slope -= learning_rate * grad_slope; intercept -= learning_rate * grad_intercept; } } ``` 接下来是预测函数。根据拟合出来的斜率和截距来计算预测值: ``` double QuantileRegression::predict(double x) { return slope * x + intercept; } ``` 最后是计算残差的函数。残差的公式为 y - (slope * x + intercept): ``` void QuantileRegression::computeResiduals() { int n = x.size(); residuals.resize(n); for (int i = 0; i < n; i++) { residuals[i] = y[i] - (slope * x[i] + intercept); } } ``` 3. 编写测试代码 最后,我们需要编写测试代码来验证分位数回归模型的实现是否正确。下面是一个简单的测试案例: ``` #include <iostream> #include "quantile_regression.h" int main() { std::vector<double> x = {1, 2, 3, 4, 5}; std::vector<double> y = {1, 3, 2, 5, 4}; QuantileRegression model(0.5); model.readData(x, y); model.fitModel(); std::cout << "Slope: " << model.getSlope() << std::endl; std::cout << "Intercept: " << model.getIntercept() << std::endl; std::cout << "Residuals:" << std::endl; std::vector<double> residuals = model.getResiduals(); for (double r : residuals) { std::cout << r << std::endl; } std::cout << "Predictions:" << std::endl; std::cout << "x=6: " << model.predict(6) << std::endl; std::cout << "x=7: " << model.predict(7) << std::endl; return 0; } ``` 在这个测试案例中,我们使用了一个包含5个样本的数据集来拟合一个分位数为0.5的回归模型。我们首先调用了 `fitModel()` 函数来拟合模型,并打印出了得到的斜率和截距。然后我们调用了 `getResiduals()` 函数来计算残差,并打印出来。最后,我们使用 `predict()` 函数来预测新的数据点的因变量值,并输出结果。 总结 分位数回归是一种有用的回归分析方法,可以用于探究自变量对因变量不同分位数的影响。在C++中,我们可以通过面向对象编程来实现分位数回归模型,并且可以使用梯度下降算法来求解最小二乘回归问题。本文提供了一个简单的实现及案例,读者可以根据自己的需求进行修改和扩展。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值