我正在做这个问题:
编写程序以检查给定数字是否是一个丑陋的数字。
丑陋的数字是正数,其主要因素仅包括2,3,5。例如,6,8是丑陋而14不丑,因为它包括另一个素因子7。
请注意,1通常被视为丑陋的数字。
这是我的尝试:
public string PlusMinus12(string hour, string minute, string second, string ampm)
{
string PlusMinus;
int rndmTmp1 = Random1();
int rndmTmp2 = Random2();
if (rndmTmp1 == 0)
{
PlusMinus = hour + ":" + minute + ":" + second + ": " + ampm;
return PlusMinus;
}
else if (rndmTmp1 == 1)
{
string temp = hour + ":" + minute + ":" + second +": " + ampm;
**DateTime subtract = DateTime.Parse(temp);**
subtract.AddSeconds(-rndmTmp2);
PlusMinus = subtract.ToString("h:mm:ss tt");
return PlusMinus;
}
else
{
不幸的是,它在测试输入-2147483648上失败了。它应该为false时返回true。
知道我做错了吗?
答案 0 :(得分:2)
你忘了以下强调的条件:
丑陋的数字是正数,其主要因素仅包括2,3,5。
因此,您只需在isUgly
方法中添加负数检查:
if (num <= 0) {
return false;
}
作为旁注,您可以通过交换isPrimeFactor
内的条件并测试isFactor(candidate, num) && isPrime(candidate)
而不是isPrime(candidate) && isFactor(candidate, num)
来提高性能。这是因为确定数字是否是另一个因素比确定数字是否是素数更快。
答案 1 :(得分:1)
我可以针对这个问题提出一个不同但速度更快的解决方案O(logn):
public static boolean isUgly(int num) {
if (num < 1) return false;
int temp;
do {
temp = num;
if (num % 2 == 0) num /= 2;
if (num % 3 == 0) num /= 3;
if (num % 5 == 0) num /= 5;
} while (temp != num);
return num == 1;
}
或模块化检查更快的方法(通过拆分do while
循环):
public static boolean isUgly(int num) {
if (num < 1) return false;
int temp;
do {
temp = num;
if (num % 2 == 0) num /= 2;
} while (temp != num);
do {
temp = num;
if (num % 3 == 0) num /= 3;
} while (temp != num);
do {
temp = num;
if (num % 5 == 0) num /= 5;
} while (temp != num);
return num == 1;
}