2021.1.21寒假打卡Day17

本文介绍了如何使用编程解决丑数和萌数的相关问题:丑数的判断依据其质因数的限制,而萌数的约数计算则是通过质因数分解的规律进行。展示了两个C++程序片段,分别用于判断一个数是否为丑数以及计算萌数的约数数量。
摘要由CSDN通过智能技术生成

丑数

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值