小Q得到一个神奇的数列: 1, 12, 123,...12345678910,1234567891011...。
并且小Q对于能否被3整除这个性质很感兴趣。
小Q现在希望你能帮他计算一下从数列的第l个到第r个(包含端点)有多少个数可以被3整除。
小Q得到一个神奇的数列: 1, 12, 123,...12345678910,1234567891011...。
并且小Q对于能否被3整除这个性质很感兴趣。
小Q现在希望你能帮他计算一下从数列的第l个到第r个(包含端点)有多少个数可以被3整除。
输入包括两个整数l和r(1 <= l <= r <= 1e9), 表示要求解的区间两端。
输出一个整数, 表示区间内能被3整除的数字个数。
2 5
3
12, 123, 1234, 12345...
其中12, 123, 12345能被3整除。
能被3整除的数是每个位置上各个位置上数加起来的数能够被3整除,此外,不能被3整除的数 各位相加为除3的余数,故余数为120120120...,发现本题中只有被3整除为1的数不能被3整除#include<iostream>
import java.util.*; public class Main{ public static void main(String[] args){ Scanner scanner = new Scanner(System.in); int left = scanner.nextInt(); int right = scanner.nextInt(); int result = (right - left)/3*2; int temp1 = (right - left) % 3; int temp2 = left % 3; if(temp2 == 0){ result += (temp1 < 2 ? 1 : 2); }else if(temp2 == 1){ result += temp1; }else{ result += Math.min(1+temp1, 2); } System.out.println(result); } }从第一个数开始,能被3整除结果为 FFTFFTFFTFFT...(F不能被3整除,T能被3整除),即每3个数中有2个可以被3整除,判断下区间端点能否被3整除的情况即可。
#include <iostream>
using namespace std;
int main()
{
long long l, r;
cin >> l >> r;
int count = 0;
long long sum = 0;
sum += (l*(l + 1)) / 2;
if (sum % 3 == 0)
{
count++;
}
if (r - l > 0) {
for (int i = l + 1; i <= r; i++)
{
sum += i;
if (sum % 3 == 0)
count++;
}
}
cout << count << endl;
return 0;
}
复杂度O(1) #include <cstdio> using namespace std; int main() { int l,r,sum=0; scanf("%d%d", &l, &r); while((l%3!=0&&(r%3)!=(l%3-1))||(l%3==0&&r%3!=2)) { r++; if(r%3!=1) sum--; } sum+=(r-l+1)/3*2; printf("%d\n", sum); }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int l = scanner.nextInt(); int r = scanner.nextInt(); int res = 0; for (int i = l; i <= r; ++i) { if (i % 3 == 0 || (i + 1) % 3 == 0) { ++res; } } System.out.println(res); scanner.close(); } }
#include <cstdio>
int main()
{
int start, end, i;
int num = 0;
long long temp = 0;
scanf("%d %d", &start, &end);
for (i = 1; i < start; ++i)
temp += i;
for (; i <= end; ++i) {
temp += i;
if (!(temp%3))
++num;
}
printf("%d", num);
return 0;
}
先把起始点的总和算出来
再依次加上去就好了,求能否被3整除
while True: try: line=raw_input().strip() if line=='': break l=int(line.split()[0]) r=int(line.split()[1]) if l%3==0: count=(r-l+1)//3 if (r-l+1)%3>=2: count+=1 elif l%3==1: count=(r-l+1)//3 if (r-l+1)%3>=1: count+=1 else: count=(r-l+1)//3 print((r-l+1)-count) except: break
难道是我理解有问题?这道题的意思难道不是一个大数的每位相加吗???
1234567891011 不应该为1+2+3+4+5+6+7+8+9+1+0+1+1能否被3整除吗??? 好吧我妥协,=-=
#include<stdio.h> #include<iostream> using namespace std; class Solution { public: int Get_ValSum(int val) { int sum = 0; while(val != 0) { sum+=(val % 10); val/=10; } return sum; } int GetTheNumOfSpecNUMBER(int _bottom, int _top) { long long count = 0; long long sum = 0; long long val = 0; while (_bottom-- > 0) { val++; sum = sum + val; } while (val <= _top) { if (sum % 3 == 0) count++; val++; sum = sum + val; } return count; } }; int main(void) { int bottom,top; scanf("%d %d",&bottom,&top); cout << Solution().GetTheNumOfSpecNUMBER(bottom,top) << endl; return 0; }
#include<iostream> (720)#include<math.h> using namespace std; void input(long long l, long long r) { long long n = 0; long long s = 0; for (l; l <= r; l++) { s = (l*(1 + l)) / 2;//:前n项和公式 if (s % 3 == 0) { n++; } } cout<<n<<endl; } int main() { int l; scanf("%d", &l); int r; getchar(); scanf("%d", &r); input(l, r); return 0; }
F1
T12
T123
F1234
T12345
T123456
F1234567
T12345678
T123456789
F12345678910
T1234567891011
T123456789101112
1 4 7 10 13 不行 import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int sNum = sc.nextInt();
int count = 0;
int eNum = sc.nextInt();
int num = eNum-sNum+1;
for (int i=sNum;i<=eNum;i++){
if(i%3-1==0){
count++;
}
}
System.out.println(num-count);
}
}
int left3(int s)//求第一个到第s个可以被3整除的个数 { int sum = 0; sum = s / 3 * 2; if (s % 3 == 2) sum++; return sum; }//right之前的个数减去 left-1之前的个数就是 left到right之间所有的可以被3整除的个数。int main() { int l, r; int sum=0; cin >> l >> r; sum=left3(r); if (l % 3 == 2 || l % 3 == 0) sum = sum - left3(l-1); cout << sum<<endl; return 0; }