题目是: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);
}
}
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!
#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;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!