版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
一道非常简单的签到题
发布时间: 2016年7月2日 20:32 最后更新: 2016年7月2日 21:48 时间限制: 1000ms 内存限制: 128M
给你k,a,b三个数,问[a,b]区间内有多少个数可以整除k。(n / k == 0)
多组输入,即输入包括多行,每行三个数k,a,b。 其中1 ≤ k ≤ 10^18,-10^18 ≤ a ≤ b ≤ 10^18。
输出包含多行,每行对应题目所要求的结果。
复制
1 1 10 2 4 16
10 7
思路
某学长出的超坑的题,之前做的很快就过了。。。现在做想半天都没想起来怎么做,wa了好多次。。
思路:首先遍历是肯定不行的,要根据a和b的值来找,先看a,b都是正数时,a/k表示1到a里(闭区间)有多少个能整除k的,b/k表示1到b里(闭区间)有多少个能整除k的,
那a到b区间里有多少个能整除k的呢??直接相减,但要特殊考虑一下a的情况,因为是闭区间;(当然也可以直接用(a-1)/k,但有些情况也要特殊考虑一下);a为负数,b为正数的时候,显然直接减就好;都为负数则要特殊考虑一下b
因此可以看出,当同为正或同为负时,要特殊考虑一下靠近零的,写几个数据想想可以了
分享几个数据: 4 3 9 4 -1 4 4 -8 -4 4 -5 -4 9 10 100 9 9 100 9 10 99 9 9 99 2 0 0
-
#include<stdio.h>
-
long long
int k,a,b,ans,n;
-
int main()
-
{
-
-
while(~scanf(
"%lld %lld %lld",&k,&a,&b))
-
{
-
ans=(b/k)-(a/k);
-
if(a>=
0)
-
{
-
if(a%k==
0)
-
ans++;
-
}
-
else
if(a<
0&&b>
0)
-
{
-
ans++;
-
}
-
else
-
{
-
if(b%k==
0)
-
ans++;
-
}
-
printf(
"%lld\n",ans);
-
}
-
return
0;
-
}
在这里插入代码片
下方添加本人理解
#include<stdio.h>
#include <bits/stdc++.h>
long long int k,a,b,ans,n;
int main()
{
while(~scanf("%lld %lld %lld",&k,&a,&b))
{
ans=(b/k)-(a/k);
if(a>=0) // 同正,考虑 左区间
{
if(a%k==0)
ans++;
}
else if(a<0&&b>0) // 额外 算 0,0可整除任意数
{
ans++;
}
else // 同为负值 考虑右区间
{ //无论同正 同负,皆考虑 离0 近的端点
if(b%k==0)
ans++;
}
printf("%lld\n",ans);
}
return 0;
}