一个有序数列,序列中的每一个值都能够被2或者3或者5所整除,这个序列的初始值从1开始,但是1并不在这个数列中。求第1500个值是多少?
2,3,5之间互相不能整除,估考虑其最小公倍数是30,在30之中,能被2整除的有15个,能被3整除的有10个,能被5整除的有6个共有31个,而其中能同时被2,3整除的既是6的倍数有5个,被2,5整除既是10的倍数有3个,能被3,5整除既是15的倍数有2个,既有10个是被重复加入的,再加上2,3,5可以共同整除的30,1个。既在前30个数字中符合题目要求的有22个。1500除以22等于68余数为4既,在第69组三十个数的第4个即为所求答案。68*30=2040。每组中第一个数字是2,第二个数字是3,第三个数字是4,第五个数字是5。故其结果为2040+5=2045
public int func(int n) { int k = 0; int number[] = new int[n + 1]; int index[] = new int[3]; number[k] = 1; index[0] = index[1] = index[2] = 1; while (k < n) { while (2 * index[0] <= number[k]) index[0]++; while (3 * index[1] <= number[k]) index[1]++; while (5 * index[2] <= number[k]) index[2]++; number[++k] = min(2 * index[0], 3 * index[1], 5 * index[2]); } return number[n]; }明天再找规律,先把代码贴上,运行结果为2045。 原理和寻找丑数类似。只不过丑数要求所有因子只有2,3,5而这个只需要含有2,3,5中一个就行。
#include <iostream> using namespace std; void main() { int num = 0; int sum = 0; for (int i = 1; i < 2051; i++) { if ((i % 2 == 0) || (i % 3 == 0) || (i % 5 == 0)) { num++; sum = i; } if (num == 1500) { break; } } cout << sum << endl; }
public class test { public static void main(String[] args) { int count=0; for(int i=2;i<=10000;++i) { if (check(i)) { ++count; if (count==1500) { System.out.println(i); return; } } } } private static boolean check(int i) { return i%2==0 || i%3==0 || i%5==0; } }代码的运行结果为2045;
private static int find(int j){ int i = 0,num = 2; while(true){ if(num%2==0 || num%3==0 || num%5==0){ if(++i == j) return num; }num++;}}
故,结果为68*30=2040+5=2045