Learning C/C++

来源:互联网 发布:ubuntu 商业版 编辑:程序博客网 时间:2024/06/05 05:23
#include<iostream>
using namespace std;
//只包含因子2,3,5的数称为丑数;
int Min(int a1, int a2, int a3)
{
int min = (a1 < a2) ? a1 : a2;
return (min < a3) ? min : a3;
}
int GetUglyNumber(int index)
{
if(index <= 0)
return 0;
int *pUglyNumbers = new int[index];
pUglyNumbers[0] = 1;
int nextIndex = 1;
int *p2 = pUglyNumbers;
int *p3 = pUglyNumbers;
int *p5 = pUglyNumbers;
while(nextIndex < index)
{
int min = Min(*p2 * 2, *p3 * 3, *p5 * 5);
pUglyNumbers[nextIndex] = min;
while(*p2 * 2 <= pUglyNumbers[nextIndex])//找到2倍数刚好大于排好序的末数的那个数
++p2;
while(*p3 * 3 <= pUglyNumbers[nextIndex])//找到3倍数刚好大于排好序的末数的那个数
++p3;
while(*p5 * 5 <= pUglyNumbers[nextIndex])//找到5倍数刚好大于排好序的末数的那个数
++p5;
++nextIndex;
}
int ugly = pUglyNumbers[nextIndex - 1];
delete[] pUglyNumbers;
return ugly;
}
//求包含2或3或5的数的序列;
int GetNumber(int index)
{
if(index < 1)
return 0;
int *pNumbers = new int[index + 1];
pNumbers[0] = 1;
int pindex = 1;
int pNum = 1;
while (pindex <= index)
{
++pNum;
if((pNum % 2 == 0 )|| (pNum % 3 == 0 ) || (pNum % 5 == 0 ))
pNumbers[pindex ++] = pNum;
}
int number = pNumbers[index];
delete[] pNumbers;
return number;
}
int GetNumber_refine(int index)
{
if(index < 1)
return 0;
int *pNumbers = new int[index + 1];
pNumbers[0] = 1;
int pIndex = 1;
int i2 = 1;
int i3 = 1;
int i5 = 1;
while(pIndex <= index)
{
int min = Min(2 * i2, 3 * i3, 5 * i5);
pNumbers[pIndex] = min;
while(2 * i2 <= pNumbers[pIndex])
++i2;
while(3 * i3 <= pNumbers[pIndex])
++i3;
while(5 * i5 <= pNumbers[pIndex])
++i5;
++pIndex;
}
int number = pNumbers[index];
delete[] pNumbers;
return number;
}
0 0