#31.整数中1出现的次数(从1到n整数中1出现的次数)
/************************************************************************/
/* 题目描述
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。
ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数) */
/************************************************************************/
/*
#include <iostream>
using namespace std;
int NumberOf1Between1AndN_Solution(int n)
{
if (n < 1)
return 0;
if (n == 1)
return 1;
int base = 1, remain = 0, current = 0, num = 0;
while (n)
{
current = n % 10;
n /= 10;
if (current > 1)
{
num += (n + 1)*base;
}
else if (current == 1)
{
num += (n*base) + remain + 1;
}
else
{
num += n * base;
}
remain += current * base;
base *= 10;
}
return num;
}
int main()
{
int n = 13;
cout << NumberOf1Between1AndN_Solution(n) << endl;
system("pause");
return 0;
}
*/
#32.把数组排成最小的数
/*
题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323
*/
#include <iostream>
#include <vector>
#include <sstream>
#include <vector>
#include <algorithm>
using namespace std;
static bool compare(string str1, string str2)
{
string s1 = str1 + str2;
string s2 = str2 + str1;
return s1 < s2;
}
string PrintMinNumber(vector<int> numbers)
{
string str;
if (numbers.empty())
return str;
vector<string> vec;
for (int i = 0; i < numbers.size(); i++)
{
stringstream ss;
ss << numbers[i];
vec.push_back(ss.str());
}
sort(vec.begin(), vec.end(), compare);
for (int i = 0; i < vec.size(); i++)
{
str.append(vec[i]);
}
return str;
}
int main()
{
vector<int> vec;
vec.push_back(3);
vec.push_back(32);
vec.push_back(321);
string str = PrintMinNumber(vec);
cout << str << endl;
system("pause");
return 0;
}
#33.丑数
/*
题目描述
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
*/
int GetUglyNumber_Solution(int index) {
switch (index)
{
case 1:return 1;
case 2:return 2;
case 3:return 3;
case 4:return 4;
case 5:return 5;
}
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
vec.push_back(5);
for (int i = 5; i <= index; i++)
{
int temp = 0,min2 = 0, min5=0,min3=0;
for (int j = 0; j < i; j++)
{
temp = vec[j] * 2;
if (temp > vec[i - 1])
{
min2 = temp;
break;
}
}
for (int j = 0; j < i; j++)
{
temp = vec[j] * 5;
if (temp > vec[i - 1])
{
min5 = temp;
break;
}
}
for (int j = 0; j < i; j++)
{
temp = vec[j] * 3;
if (temp > vec[i-1])
{
min3 = temp;
break;
}
}
int min = min2 < min3 ? min2 : min3;
min = min < min5 ? min : min5;
vec.push_back(min);
}
return vec[index-1];
}