题目描述:707829217是两个素数a,b的乘积值。1.求出a,b值。2,若a>b,则将a拼接上b(即ab)得到一个新数c,求1到c奇数序列中3的个数。
代码如下:
package test;
import java.util.Date;
/**
* 866278171
* 3的个数:368247332
* @author Administrator
*/
public class Test {
private static long maxn=707829217L;//707829217L
public static void main(String[] args){
int s=(int)maxn/2;
System.out.println("s="+s);
Date startDate=new Date();
System.out.println("开始时间:"+startDate);
int[] prims=new int[s];
//找到所有素数
Date startDate2=new Date();
System.out.println("开始查找"+s+"内所有素数*************");
System.out.println("开始时间:"+startDate2);
int len = findPrims(s,prims);
Date endDate2=new Date();
System.out.println("结束时间:"+endDate2);
System.out.println("耗时:"+(endDate2.getTime()-startDate2.getTime())/(1000*60)+"分钟");
System.out.println("结束查找"+s+"内所有素数*************");
//从素数数组中找到两个素数,使得乘积为maxn
// System.out.println("len="+len);
long result=check(prims,len);
//查找奇数序列中3的个数
long num=findNum(result);
System.out.println("3的个数:"+num);
Date endDate=new Date();
System.out.println("结束时间:"+endDate);
System.out.println("耗时:"+(endDate.getTime()-startDate.getTime())/(1000*60)+"分钟");
}
private static long findNum(long result) {
long count=0L;
for(int i=1;i<result+1;i+=2){
int temp=i;
while(temp!=0){
//取temp的个位数
int g=temp%10;
//判断该数是否为3
if(g==3){
count++;
}
//去除个位数
temp/=10;
}
}
return count;
}
private static long check(int[] prims, int len) {
boolean flag=false;
int a=0;
int b=0;
for(int i=2;i<len;i++){
for(int j=i+1;j<len;j++){
long temp=(long)(prims[i]*prims[j]);
if(temp>maxn){//后续的不需要再计算了
break;
}
if(temp==maxn){
flag=true;
a=prims[i];
b=prims[j];
break;
}
}
if(flag){
break;
}
}
long result=a*b;
System.out.println("flag="+flag+",a="+a+",b="+b+",a*b="+result+","+b+a);
return result;
}
private static int findPrims(int s, int[] prims) {
int len=0;
for(int i=2;i<s;i++){
if(isPrim(i)){
prims[len++]=i;
}
}
return len;
}
private static boolean isPrim(int num) {
boolean flag=true;//是否为素数
int temp=(int)Math.sqrt(num);
for(int i=2;i<=temp;i++){
if(num%i==0){
flag=false;//不是
break;
}
}
return flag;
}
//查找奇数序列中3的个数
}
运行结果:
开始时间:Fri Apr 12 13:47:06 CST 2019
开始查找353914608内所有素数*************
开始时间:Fri Apr 12 13:47:08 CST 2019
结束时间:Fri Apr 12 14:06:49 CST 2019
耗时:19分钟
结束查找353914608内所有素数*************
flag=true,a=8171,b=86627,a*b=707829217
3的个数:368247332
结束时间:Fri Apr 12 14:06:57 CST 2019
耗时:19分钟