|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
题目是输入描述
输入一个整数数n。0≤n≤1e12
。
输出描述
输出一个整数表示在[0,n]
中,有多少个数可以被3或5整除,如果结果是0,请输出“zero”,否则请输出结果。
我的代码是
#include<stdio.h>
int main()
{
int n,i=0,sum=0;
scanf("%d",&n);
for(;i<=n;i++)
{
if(i%3==0||i%5==0)
sum=sum+1;
}
if(sum==0) printf("zero");
if(sum>0) printf("%d",sum);
}
平台显示时间超限,错在哪了啊
您的代码时间复杂度为O(n),当输入n较大时,程序需要循环极多次,导致超时。可以考虑优化算法,将时间复杂度降为O(1)。
根据题目,我们需要统计在[0,n]中,有多少个数可以被3或5整除。我们可以先分别统计出在[0,n]中,有多少个数可以被3或5整除,再减去在[0,n]中,有多少个数可以被15整除(因为15同时是3和5的倍数,会被重复计算)。具体代码如下:
#include <stdio.h>
int main()
{
long long n;
scanf("%lld", &n);
long long cnt3 = n / 3; // 可以被3整除的数的个数
long long cnt5 = n / 5; // 可以被5整除的数的个数
long long cnt15 = n / 15; // 可以被15整除的数的个数
long long ans = cnt3 + cnt5 - cnt15; // 最终答案
if (ans == 0) printf("zero");
else printf("%lld", ans);
return 0;
}
注意,由于n的范围较大,需要使用long long类型存储。
|
|