1147: How many integers can you find(附常见错误)

题目描述

给你三个数,n,m1,m2,找出所有小于n的能被m1或m2整除的数的个数。

输入

输入包含多组测试数据,每组数据占一行。
0

输出

每组数据输出占一行。

样例输入

12 2 3

样例输出

7

提示

来源

王广威

解题思路:这道题不能用穷举法,直接找m1或m2能整除的数有多少个,因为那样做太耗时间了(如果数据比较大的话)。

离散里面讲过:比如说1~10内能被2整除的数就是10除以2=5个数;能被3整除的有10除以3,向下取整,3个数,能被2和3同时整除是10除以(2和3的最小公倍数)向下取整,1个数。然后至少能被其中一个整除的个数就用包含排斥原理即可,5+3-1=7。

注意:题目是不包含边界值n的,因此如果n输入的是10(同时n也是大于0的),应该是求1-9内能被2整除的数,共有9/2向下去整,共4个;能被3整除的有9/3=3个,能被2和3同时整除的数有9/6向下取整,共1个,因此结果就是4+3-1=6个。

代码示例:

#include
int main()
{
    int n,m1,m2,t1,t2,t3,i,amount,f,Greatest_common_divisor,Lowest_common_multiple;
    while(~scanf("%d%d%d",&n,&m1,&m2))
    {
        n=n-1;
        t1=m1;
        t2=m2;
        while(t1!=0)
        {
            t3=t2%t1;
            t2=t1;
            t1=t3;
        }
        Greatest_common_divisor=t2;//最大公约数
        Lowest_common_multiple=m1*m2/t2;//最小公倍数
        amount=n/m2+n/m1-n/Lowest_common_multiple;//统计总数
        /*离散里面讲过:
        比如说1~100内能被2整除的数就是100除以2=50个数,
        能被3整除的有100除以3,向下取整,33个数,
        能被2和3同时整除是100除以(2和3的最小公倍数)向下取整。
        然后至少能被其中一个整除的个数就用包含排斥原理即可。*/
        printf("%d\n",amount);
    }
}

你可能感兴趣的:(算法练习)