丑数
Problem Description
丑数的定义是这样的——
一个数,如果它分解后的素因子最多只有2、3、5、7四种,这个数则称为“丑数”。比如,前20个丑数是:1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27。
现在你的任务是:给你一个数,你能判断是否是丑数吗?
Input
输入数据的第一行首先是一个整数C,表示测试数据的个数,然后是C组数据,每组测试数据包含一个整数n(1 <= n <= 2^31-1)。
Output
对于每组测试数据,如果n是丑数,则请输出“ Yes”,否则,请输出“No”.
Sample Input
3
12
385875
11
Sample Output
Yes
Yes
No
不断地除2,3,5,7,直到除不了了再来判断是否属于1,2,3,5,7。
#include <iostream>
using namespace std;
int ugly(int n){
if(n==1||n==2||n==3||n==5||n==7) return 1;
else if (n%2==0) return ugly(n/2);
else if (n%3==0) return ugly(n/3);
else if (n%5==0) return ugly(n/5);
else if (n%7==0) return ugly(n/7);
else return 0;
}
int main(){
int n;
scanf("%d",&n);
unsigned long long a;
while(n--){
scanf("%llu",&a);
if(ugly(a)) printf("Yes\n");
else printf("No\n");
}
return 0;
}
萌数的约数
Problem Description
一个数,如果他的素数因子只包括2,3,5,7,则称这个数为萌数,比如,下面这些数就是前20个萌数:1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27。
现在给你一个萌数,请编程计算它的约数的个数。
比如,4是一个萌数,他有3个约数(1,2,4);12也是一个萌数,他有 6 个约数(1,2,3,4,6,12)。
Input
输入包含多组测试用例。
每个测试用例包含一个萌数n, 并且n在64位整数的范围( long long 类型,输入输出用%lld )。
如果n为0,则标志结束输入,不做处理。
Output
对于每个测试用例中的萌数,请输出他的约数的个数。
每个输出占一行。
Sample Input
4
12
0
Sample Output
3
6
既然是由质因数 2,3,5,7 相乘得到,那不妨表示为 2a × 3b × 5c × 7d
由约数个数定理可知,约数个数为 (a + 1) (b + 1) (c + 1) (d + 1)
#include<iostream>
using namespace std;
long long ugly(long long n){
static long long a=1,b=1,c=1,d=1; //初始化为 1 就不需要加 1 啦
if(n==1) {
int ans=a*b*c*d;
a=b=c=d=1;
return ans;
}
else if (n%2==0) {++a;return ugly(n/2);}
else if (n%3==0) {++b;return ugly(n/3);}
else if (n%5==0) {++c;return ugly(n/5);}
else if (n%7==0) {++d;return ugly(n/7);}
}
int main(){
long long n;
scanf("%lld",&n);
while(n!=0){
cout<<ugly(n)<<endl;
scanf("%lld",&n);
}
return 0;
}