您的位置:首页 > 职场人生

google面试题目:寻找丑数--使用double防止数据溢出

2013-04-23 08:53 302 查看
/*******************************************************************************

google面试题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。

例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。

求按从小到大的顺序的第2012个丑数。

分析:假设数组ugly
中存放不断产生的丑数,

初始只有一个丑数ugly[0]=1,由此出发,

下一个丑数由因子2,3,5竞争产生,得到ugly[0]*2,

ugly[0]*3, ugly[0]*5, 显然最小的那个数是新的丑数,

所以第2个丑数为ugly[1]=2,开始新一轮的竞争,

由于上一轮竞争中,因子2获胜,这时因子2应该乘以ugly[1]才显得公平,

得到ugly[1]*2,ugly[0]*3,ugly[0]*5,

因子3获胜,ugly[2]=3,同理,下次竞争时因子3应该乘以ugly[1],

即:ugly[1]*2, ugly[1]*3, ugly[0]*5, 因子5获胜,得到ugly[3]=5,

重复这个过程,直到第n个丑数产生。总之:

每次竞争中有一个(也可能是两个)因子胜出,下一次竞争中

胜出的因子就应该加大惩罚!

本质就是2 ,3 ,5 的乘积的组合,不过要按照顺序组合,

每次都将2,3,5乘以一个已经是丑数的数,

再比较三者的大小,小的进入数组,然后继续比较;

例如:1是丑数,那么下一个斗劲 2 * 1、3 * 1和5*1,

那么获得的是2,2进入数组,下面比较的是2*2、3*1 和5*1

( 重视因为后面的3*1和5*1的大小并不断定,所以还要持续进行比较)

获得3进入数组,再比较 2 * 2、3 * 2和5*1.

感谢网友的评论,发现了程序的问题

是因为int型表示数据范围有限倒置数据溢出,后来改成unsigned long int 仍然溢出

最后只能改成double 了

三者的表示的数据范围如下:

numeric_limits<int>::max --> 2147483647    第1692个丑数越界

numeric_limits<unsigned long int>::max --> 4294967295  第1849个丑数越界

numeric_limits<double>::max --> 1.79769e+308

************************************************************************/

#include<iomanip> // 精度控制头文件

#include<cstdio>

#include<iostream>

#include<cstdlib>

#include<limits>

using namespace std;

/*the smallest in the three*/

//无符号长整型    防止数据溢出

double mymin(double a, double b, double c)

{

    double temp = (a < b ? a : b);

    return (temp < c ? temp : c);

}

//无符号长整型    防止数据溢出

double FindUgly(int n)

{

    double* ugly = new double
;

    ugly[0] = 1;

    int index2 = 0;

    int index3 = 0;

    int index5 = 0;

    int index = 1;

    while (index < n)

    {

        double val = mymin(ugly[index2]*2, ugly[index3]*3, ugly[index5]*5);

        //竞争产生下一个丑数

        if (val == ugly[index2]*2)

        //将产生这个丑数的index*向后挪一位;

            ++index2;

        if (val == ugly[index3]*3)

        //这里不能用elseif,因为可能有两个最小值,这时都要挪动;

            ++index3;

        if (val == ugly[index5]*5)

            ++index5;

        ugly[index++] = val;

    }

    double result = ugly[n-1]; //ugly[0] = 1  是第一个丑数

    delete[] ugly;

    return result;

}

void test1_29()

{

    for(int i=1;i<30;i++)

    cout<<"the "<<i<<" th ugly number is "<<FindUgly(i)<<endl;

}

void test1680_1700()

{

    for(int i=1680;i<1701;i++)

    cout<<"the "<<i<<" th ugly number is "<<setprecision(10)<<FindUgly(i)<<endl;

}

void test1800_1991()

{

    for(int i=1800;i<1991;i++)

    cout<<"the "<<i<<" th ugly number is "<<setprecision(10)<<FindUgly(i)<<endl;

}

void test1991_2013()

{

    for(int i=1991;i<2014;i++)

    cout<<"the "<<i<<" th ugly number is "<<setprecision(10)<<FindUgly(i)<<endl;

}

int main()

{

    cout<<"numeric_limits<int>::max --> "

        <<(std::numeric_limits<int>::max)()<<endl;

    cout<< "numeric_limits<unsigned long int>::max --> "

        <<(std::numeric_limits<unsigned long int>::max)()<<endl;

    cout<< "numeric_limits<double>::max --> "

        <<(std::numeric_limits<double>::max)()<<endl;

    test1_29();

    cout<<endl<<"----------------------------"<<endl;

    test1680_1700();

    cout<<endl<<"----------------------------"<<endl;

    test1800_1991();

    cout<<endl<<"----------------------------"<<endl;

    test1991_2013();

    return 0;

}

/***************************

numeric_limits<int>::max --> 2147483647

numeric_limits<unsigned long int>::max --> 4294967295

numeric_limits<double>::max --> 1.79769e+308

the 1 th ugly number is 1

the 2 th ugly number is 2

the 3 th ugly number is 3

the 4 th ugly number is 4

the 5 th ugly number is 5

the 6 th ugly number is 6

the 7 th ugly number is 8

the 8 th ugly number is 9

the 9 th ugly number is 10

the 10 th ugly number is 12

the 11 th ugly number is 15

the 12 th ugly number is 16

the 13 th ugly number is 18

the 14 th ugly number is 20

the 15 th ugly number is 24

the 16 th ugly number is 25

the 17 th ugly number is 27

the 18 th ugly number is 30

the 19 th ugly number is 32

the 20 th ugly number is 36

the 21 th ugly number is 40

the 22 th ugly number is 45

the 23 th ugly number is 48

the 24 th ugly number is 50

the 25 th ugly number is 54

the 26 th ugly number is 60

the 27 th ugly number is 64

the 28 th ugly number is 72

the 29 th ugly number is 75

----------------------------

the 1680 th ugly number is 2025000000

the 1681 th ugly number is 2038431744

the 1682 th ugly number is 2040733440

the 1683 th ugly number is 2048000000

the 1684 th ugly number is 2050312500

the 1685 th ugly number is 2066242608

the 1686 th ugly number is 2073600000

the 1687 th ugly number is 2097152000

the 1688 th ugly number is 2099520000

the 1689 th ugly number is 2109375000

the 1690 th ugly number is 2123366400

the 1691 th ugly number is 2125764000

the 1692 th ugly number is 2147483648

the 1693 th ugly number is 2149908480

the 1694 th ugly number is 2152336050

the 1695 th ugly number is 2160000000

the 1696 th ugly number is 2176782336

the 1697 th ugly number is 2187000000

the 1698 th ugly number is 2197265625

the 1699 th ugly number is 2211840000

the 1700 th ugly number is 2214337500

----------------------------

the 1800 th ugly number is 3456000000

the 1801 th ugly number is 3486784401

the 1802 th ugly number is 3499200000

the 1803 th ugly number is 3515625000

the 1804 th ugly number is 3538944000

the 1805 th ugly number is 3542940000

the 1806 th ugly number is 3583180800

the 1807 th ugly number is 3587226750

the 1808 th ugly number is 3600000000

the 1809 th ugly number is 3623878656

the 1810 th ugly number is 3627970560

the 1811 th ugly number is 3645000000

the 1812 th ugly number is 3662109375

the 1813 th ugly number is 3673320192

the 1814 th ugly number is 3686400000

the 1815 th ugly number is 3690562500

the 1816 th ugly number is 3732480000

the 1817 th ugly number is 3750000000

the 1818 th ugly number is 3774873600

the 1819 th ugly number is 3779136000

the 1820 th ugly number is 3796875000

the 1821 th ugly number is 3822059520

the 1822 th ugly number is 3826375200

the 1823 th ugly number is 3840000000

the 1824 th ugly number is 3869835264

the 1825 th ugly number is 3874204890

the 1826 th ugly number is 3888000000

the 1827 th ugly number is 3906250000

the 1828 th ugly number is 3932160000

the 1829 th ugly number is 3936600000

the 1830 th ugly number is 3955078125

the 1831 th ugly number is 3981312000

the 1832 th ugly number is 3985807500

the 1833 th ugly number is 4000000000

the 1834 th ugly number is 4026531840

the 1835 th ugly number is 4031078400

the 1836 th ugly number is 4050000000

the 1837 th ugly number is 4076863488

the 1838 th ugly number is 4081466880

the 1839 th ugly number is 4096000000

the 1840 th ugly number is 4100625000

the 1841 th ugly number is 4132485216

the 1842 th ugly number is 4147200000

the 1843 th ugly number is 4194304000

the 1844 th ugly number is 4199040000

the 1845 th ugly number is 4218750000

the 1846 th ugly number is 4246732800

the 1847 th ugly number is 4251528000

the 1848 th ugly number is 4271484375

the 1849 th ugly number is 4294967296

the 1850 th ugly number is 4299816960

the 1851 th ugly number is 4304672100

the 1852 th ugly number is 4320000000

the 1853 th ugly number is 4353564672

the 1854 th ugly number is 4374000000

the 1855 th ugly number is 4394531250

the 1856 th ugly number is 4423680000

the 1857 th ugly number is 4428675000

the 1858 th ugly number is 4478976000

the 1859 th ugly number is 4500000000

the 1860 th ugly number is 4529848320

the 1861 th ugly number is 4534963200

the 1862 th ugly number is 4556250000

the 1863 th ugly number is 4586471424

the 1864 th ugly number is 4591650240

the 1865 th ugly number is 4608000000

the 1866 th ugly number is 4613203125

the 1867 th ugly number is 4649045868

the 1868 th ugly number is 4665600000

the 1869 th ugly number is 4687500000

the 1870 th ugly number is 4718592000

the 1871 th ugly number is 4723920000

the 1872 th ugly number is 4746093750

the 1873 th ugly number is 4777574400

the 1874 th ugly number is 4782969000

the 1875 th ugly number is 4800000000

the 1876 th ugly number is 4831838208

the 1877 th ugly number is 4837294080

the 1878 th ugly number is 4860000000

the 1879 th ugly number is 4882812500

the 1880 th ugly number is 4897760256

the 1881 th ugly number is 4915200000

the 1882 th ugly number is 4920750000

the 1883 th ugly number is 4976640000

the 1884 th ugly number is 4982259375

the 1885 th ugly number is 5000000000

the 1886 th ugly number is 5033164800

the 1887 th ugly number is 5038848000

the 1888 th ugly number is 5062500000

the 1889 th ugly number is 5096079360

the 1890 th ugly number is 5101833600

the 1891 th ugly number is 5120000000

the 1892 th ugly number is 5125781250

the 1893 th ugly number is 5159780352

the 1894 th ugly number is 5165606520

the 1895 th ugly number is 5184000000

the 1896 th ugly number is 5242880000

the 1897 th ugly number is 5248800000

the 1898 th ugly number is 5273437500

the 1899 th ugly number is 5308416000

the 1900 th ugly number is 5314410000

the 1901 th ugly number is 5368709120

the 1902 th ugly number is 5374771200

the 1903 th ugly number is 5380840125

the 1904 th ugly number is 5400000000

the 1905 th ugly number is 5435817984

the 1906 th ugly number is 5441955840

the 1907 th ugly number is 5467500000

the 1908 th ugly number is 5509980288

the 1909 th ugly number is 5529600000

the 1910 th ugly number is 5535843750

the 1911 th ugly number is 5598720000

the 1912 th ugly number is 5625000000

the 1913 th ugly number is 5662310400

the 1914 th ugly number is 5668704000

the 1915 th ugly number is 5695312500

the 1916 th ugly number is 5733089280

the 1917 th ugly number is 5739562800

the 1918 th ugly number is 5760000000

the 1919 th ugly number is 5804752896

the 1920 th ugly number is 5811307335

the 1921 th ugly number is 5832000000

the 1922 th ugly number is 5859375000

the 1923 th ugly number is 5898240000

the 1924 th ugly number is 5904900000

the 1925 th ugly number is 5971968000

the 1926 th ugly number is 5978711250

the 1927 th ugly number is 6000000000

the 1928 th ugly number is 6039797760

the 1929 th ugly number is 6046617600

the 1930 th ugly number is 6075000000

the 1931 th ugly number is 6103515625

the 1932 th ugly number is 6115295232

the 1933 th ugly number is 6122200320

the 1934 th ugly number is 6144000000

the 1935 th ugly number is 6150937500

the 1936 th ugly number is 6198727824

the 1937 th ugly number is 6220800000

the 1938 th ugly number is 6250000000

the 1939 th ugly number is 6291456000

the 1940 th ugly number is 6298560000

the 1941 th ugly number is 6328125000

the 1942 th ugly number is 6370099200

the 1943 th ugly number is 6377292000

the 1944 th ugly number is 6400000000

the 1945 th ugly number is 6442450944

the 1946 th ugly number is 6449725440

the 1947 th ugly number is 6457008150

the 1948 th ugly number is 6480000000

the 1949 th ugly number is 6530347008

the 1950 th ugly number is 6553600000

the 1951 th ugly number is 6561000000

the 1952 th ugly number is 6591796875

the 1953 th ugly number is 6635520000

the 1954 th ugly number is 6643012500

the 1955 th ugly number is 6710886400

the 1956 th ugly number is 6718464000

the 1957 th ugly number is 6750000000

the 1958 th ugly number is 6794772480

the 1959 th ugly number is 6802444800

the 1960 th ugly number is 6834375000

the 1961 th ugly number is 6879707136

the 1962 th ugly number is 6887475360

the 1963 th ugly number is 6912000000

the 1964 th ugly number is 6973568802

the 1965 th ugly number is 6998400000

the 1966 th ugly number is 7031250000

the 1967 th ugly number is 7077888000

the 1968 th ugly number is 7085880000

the 1969 th ugly number is 7119140625

the 1970 th ugly number is 7166361600

the 1971 th ugly number is 7174453500

the 1972 th ugly number is 7200000000

the 1973 th ugly number is 7247757312

the 1974 th ugly number is 7255941120

the 1975 th ugly number is 7290000000

the 1976 th ugly number is 7324218750

the 1977 th ugly number is 7346640384

the 1978 th ugly number is 7372800000

the 1979 th ugly number is 7381125000

the 1980 th ugly number is 7464960000

the 1981 th ugly number is 7500000000

the 1982 th ugly number is 7549747200

the 1983 th ugly number is 7558272000

the 1984 th ugly number is 7593750000

the 1985 th ugly number is 7644119040

the 1986 th ugly number is 7652750400

the 1987 th ugly number is 7680000000

the 1988 th ugly number is 7688671875

the 1989 th ugly number is 7739670528

the 1990 th ugly number is 7748409780

----------------------------

the 1991 th ugly number is 7776000000

the 1992 th ugly number is 7812500000

the 1993 th ugly number is 7864320000

the 1994 th ugly number is 7873200000

the 1995 th ugly number is 7910156250

the 1996 th ugly number is 7962624000

the 1997 th ugly number is 7971615000

the 1998 th ugly number is 8000000000

the 1999 th ugly number is 8053063680

the 2000 th ugly number is 8062156800

the 2001 th ugly number is 8100000000

the 2002 th ugly number is 8153726976

the 2003 th ugly number is 8162933760

the 2004 th ugly number is 8192000000

the 2005 th ugly number is 8201250000

the 2006 th ugly number is 8264970432

the 2007 th ugly number is 8294400000

the 2008 th ugly number is 8303765625

the 2009 th ugly number is 8388608000

the 2010 th ugly number is 8398080000

the 2011 th ugly number is 8437500000

the 2012 th ugly number is 8493465600

the 2013 th ugly number is 8503056000

Process returned 0 (0x0)   execution time : 1.427 s

Press any key to continue.

****************************/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: