关于#C语言循环超时问题

题目是:Alice喜欢n位数,Bob喜欢能被m整除的数,请问被Alice和Bob都喜欢的数有多少个?

我最开始给出的答案是:

#include<stdio.h>
#include<math.h>
int main()
{
    int i,k;
    scanf("%d",&k);
    while(k--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        int n1,m1;
        if(n==1)
        {
            n1=0;
            m1=9;
        }
            
        else
        {
            n1=1;
            m1=1;
            for(i=1;i<n;i++){
                n1*=10;
            }
            for(i=1;i<n+1;i++){
                m1*=10;
            }
            m1=m1-1;
        }    
        int num=0;
        for(i=n1;i<=m1;i++)
        {
            if(i%m==0)
            num++;
        }
        printf("%d",num);        
    }
}

结果显示: Time Limit Exceed

我尝试用while替换for循环:

#include<stdio.h>
#include<math.h>
int main()
{
    int i,k;
    scanf("%d",&k);
    while(k--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        int n1,m1;
        if(n==1)
        {
            n1=0;
            m1=9;
        }
            
        else
        {
            n1=1;
            m1=1;
            int num=n+1;
            while(n--){
                n1*=10;
            }
            while(num--){
                m1*=10;
            }
            m1=m1-1;
        }    
        int num=0;
        for(i=n1;i<=m1;i++)
        {
            if(i%m==0)
            num++;
        }
        printf("%d",num);        
    }
}

但是还是显示超时,想问该怎么改?

这个不能用循环逐个判断,用循环就会超时
数学问题,n位数最大数是10的n次方-1,这个数除m向下取整得到的商再减去n-1位数最大的数除以m得到的商就是他们都喜欢的数
你题目的解答代码如下:

#include<stdio.h>
#include<math.h>
int main()
{
    int i,k;
    scanf("%d",&k);
    while(k--)
    {
        long long n,m;
        scanf("%lld%lld",&n,&m);
        long long n1,m1,num=0;
        m1 = (long long)pow(10, n) - 1;
        n1 = m1/10;
        num = m1 / m - n1 / m;
        if (n==1) //1位数包括0,0可以被任何数整除
            num++; //所以结果要加1
        printf("%lld\n",num);
    }
}

img

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img

#include <stdio.h>
#include <math.h>
int main()
{
    int k;
    scanf("%d",&k);
    while(k--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        __int64 count;
        if(n==1)
        {
            count=9/m;
            printf("%I64d\n",count+1);
        }
        else
        {
            __int64 a,b;//int a,b;太小,不能满足
            a=pow(10,n)-1;//pow()函数返回的是浮点型数,pow()-1后,因为a是整型数,将会自动转换成整型数。
            a/=m;//这里是整型计算,将会忽略小数点,不会四舍五入
            b=pow(10,n-1)-1;//同上
            b/=m;
            count=a-b;
            printf("%I64d\n",count);
        }
    }
    return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632