打印1到最大的n位数
2016-05-16 13:09
288 查看
//输入数字n,按顺序打印出从1最大的n位十进制数。
//比如输入3,则打印1、2、3一直到最大的3位数即999.
#include "iostream"
#include "string"
#include "vector"
using namespace std;
//用一个string做加法器
void stringAdd(string &str)
{
if (str.empty())
{
str = "1";
return;
}
int len = static_cast<int>(str.size());
for (int i = len - 1; i >= 0; i--)
{
if (str[i] == '9')
str[i] = '0';
else
{
str[i]++;
return;
}
}
str = "1" + str;
return;
}
void print1ToMaxOfNDigits_1_str(int n)
{
if (n <= 0)
return;
string max = string(n, '9');
string str("1");
while (str != max)
{
cout << str << ",";
stringAdd(str);
}
cout << str << endl;
}
//做一个vector的加法器
void vectorAdd(vector<int> &vec)
{
if (vec.empty())
{
vec.push_back(1);
return;
}
for (size_t i = 0; i < vec.size(); i++) //index大小正比位数高低
{
if ((vec[i]) == 9)
vec[i] = 0;
else
{
vec[i] += 1;
return;
}
}
vec.push_back(1);
return;
}
void printVecAsNum(const vector<int> &num)
{
for (int i = static_cast<int>(num.size()) - 1; i >= 0; i--)
{
cout << num[i];
}
}
bool MaxofNDigits(const vector<int> &vec, int n)
{
if (vec.size() < n)
return false;
for (size_t i = 0; i < vec.size(); i++)
{
if (vec[i] != 9)
return false;
}
return true;
}
void print1ToMaxOfNDigits_1_vec(int n)
{
if (n <= 0)
return;
vector<int> num;
vectorAdd(num);
while (!MaxofNDigits(num, n))
{
printVecAsNum(num);
cout << ",";
vectorAdd(num);
}
printVecAsNum(num);
cout << endl;
}
//转化成全排列问题
void printNum(char* num)
{
int len = strlen(num);
int i = 0;
while (num[i] == '0')
i++;
while (i < len)
{
printf("%c", num[i]);
i++;
}
printf("\t"); //这里格式就没用“,”隔开了,更简单了。
}
void print1ToMaxOfNDigitsRecursively(char* num, int len, int index)
{
if (index == len - 1)
{
printNum(num);
return;
}
for (int i = 0; i < 10; i++)
{
num[index + 1] = i + '0';
print1ToMaxOfNDigitsRecursively(num, len, index + 1);
}
}
void print1ToMaxOfNDigits_1_permutation(int n)
{
if (n <= 0)
return;
char* num = new char[n + 1];
num
= '\0';
for (int i = 0; i < 10; i++)
{
num[0] = i + '0';
print1ToMaxOfNDigitsRecursively(num, n, 0);
}
delete[] num;
}
void test()
{
print1ToMaxOfNDigits_1_str(-1);
print1ToMaxOfNDigits_1_str(0);
print1ToMaxOfNDigits_1_permutation(2);
print1ToMaxOfNDigits_1_str(5);
}
int main()
{
test();
return 0;
}
三种方法,个人更倾向于string的方法。(关于输出格式,可以根据需求更改。)
这里主要是考虑大数问题,如果对效率要求高,可以甚至阈值,当小于某个数max(int)-1,直接递增输出。大于之后才用其他的方法。
//比如输入3,则打印1、2、3一直到最大的3位数即999.
#include "iostream"
#include "string"
#include "vector"
using namespace std;
//用一个string做加法器
void stringAdd(string &str)
{
if (str.empty())
{
str = "1";
return;
}
int len = static_cast<int>(str.size());
for (int i = len - 1; i >= 0; i--)
{
if (str[i] == '9')
str[i] = '0';
else
{
str[i]++;
return;
}
}
str = "1" + str;
return;
}
void print1ToMaxOfNDigits_1_str(int n)
{
if (n <= 0)
return;
string max = string(n, '9');
string str("1");
while (str != max)
{
cout << str << ",";
stringAdd(str);
}
cout << str << endl;
}
//做一个vector的加法器
void vectorAdd(vector<int> &vec)
{
if (vec.empty())
{
vec.push_back(1);
return;
}
for (size_t i = 0; i < vec.size(); i++) //index大小正比位数高低
{
if ((vec[i]) == 9)
vec[i] = 0;
else
{
vec[i] += 1;
return;
}
}
vec.push_back(1);
return;
}
void printVecAsNum(const vector<int> &num)
{
for (int i = static_cast<int>(num.size()) - 1; i >= 0; i--)
{
cout << num[i];
}
}
bool MaxofNDigits(const vector<int> &vec, int n)
{
if (vec.size() < n)
return false;
for (size_t i = 0; i < vec.size(); i++)
{
if (vec[i] != 9)
return false;
}
return true;
}
void print1ToMaxOfNDigits_1_vec(int n)
{
if (n <= 0)
return;
vector<int> num;
vectorAdd(num);
while (!MaxofNDigits(num, n))
{
printVecAsNum(num);
cout << ",";
vectorAdd(num);
}
printVecAsNum(num);
cout << endl;
}
//转化成全排列问题
void printNum(char* num)
{
int len = strlen(num);
int i = 0;
while (num[i] == '0')
i++;
while (i < len)
{
printf("%c", num[i]);
i++;
}
printf("\t"); //这里格式就没用“,”隔开了,更简单了。
}
void print1ToMaxOfNDigitsRecursively(char* num, int len, int index)
{
if (index == len - 1)
{
printNum(num);
return;
}
for (int i = 0; i < 10; i++)
{
num[index + 1] = i + '0';
print1ToMaxOfNDigitsRecursively(num, len, index + 1);
}
}
void print1ToMaxOfNDigits_1_permutation(int n)
{
if (n <= 0)
return;
char* num = new char[n + 1];
num
= '\0';
for (int i = 0; i < 10; i++)
{
num[0] = i + '0';
print1ToMaxOfNDigitsRecursively(num, n, 0);
}
delete[] num;
}
void test()
{
print1ToMaxOfNDigits_1_str(-1);
print1ToMaxOfNDigits_1_str(0);
print1ToMaxOfNDigits_1_permutation(2);
print1ToMaxOfNDigits_1_str(5);
}
int main()
{
test();
return 0;
}
三种方法,个人更倾向于string的方法。(关于输出格式,可以根据需求更改。)
这里主要是考虑大数问题,如果对效率要求高,可以甚至阈值,当小于某个数max(int)-1,直接递增输出。大于之后才用其他的方法。
相关文章推荐
- 新浪微博提示sso package or sign error
- 电影,电视
- iOS 25个性能优化/内存优化常用方法
- JEE 开源项目收集
- 第八次作业
- 堆排序
- Ex2010-09 Create a new Certificate
- CentOS7安装GNOME图形界面
- Java中String 和 int类型的转换
- MyBatis和SpringMVC的整合<mvc>标签报错分析
- 每天一个Linux命令(18)loacte命令
- Tcp协议的窗口
- nested exception is java.lang.NoSuchFieldError: QUALIFIED
- 自定义View实战(二)QQ健康水滴形加载
- STM8 的汇编学习
- android viewpager 弹性效果的实现,首页往左拉弹回,尾页往右拉弹回
- 最短路径算法之dijistra
- VMware Tools在RHEL7虚拟机上的安装与卸载
- Android之解决aidl里面函数参数太大不能跨进程通信的问题
- 如何让你的网站显示速度更快