【京东】47幸运数

今天写出来的,现在看来也没那么难。。。。。昨天就死活想不到
package com.company;

import java.util.Scanner;

public class Main {
//n 第几个幸运数  返回几位数
public static int getDigit(int n) {
int digit = 0;
int count = 0;
while (true) {
digit++;
count += Math.pow(2, digit);
if (n <= count) {
break;
}

}
return digit;
}

//获取第n个幸运数
public static String getLuckyNum(int n) {
String ret = "";
int digit = getDigit(n);
int frontCount = 0;
for (int i = 1; i < digit; i++) {
frontCount += Math.pow(2, i);
}
int groupCount = (int) Math.pow(2, digit);
int grougIndex = n - frontCount;
for (int i = 0; i < digit; i++) {
if (grougIndex <= groupCount / 2) {
ret += "4";
} else {
ret += "7";
grougIndex -= groupCount/2;
}
groupCount /= 2;
}
return ret;

}


public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextInt()) {
int n = scanner.nextInt();
int[] a = new int[3];
for (int i = 0; i < n; i++) {
a[i] = scanner.nextInt();
}
for (int i = 0; i <n; i++){
System.out.println(getLuckyNum(a[i]));
}
}
}

}


//之前的考虑不周全,参考http://blog.tk-xiong.com/archives/956写了一个又。。。点赞,用格雷码写,牛人好多啊

package com.company;

import java.util.Scanner;

public class Main {
    public static void luckNum(long n){
        if (n <= 0){
            return;
        }
        long prev = (n-1)/2;
        long now = n-2*prev;
        if (n ==1){
            System.out.print(4);
            return;
        }else if (n==2){
            System.out.print(7);
            return;
        }else {
            if (prev > 0){
                luckNum(prev);
            }
            if (now > 0){
                luckNum(now);
            }

        }



    }


    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextInt()) {
            int n = scanner.nextInt();
            long[] a = new long[n];
            for (int i = 0; i < n; i++) {
                a[i] = scanner.nextLong();
            }
            for (int i = 0;i<n;i++){
                luckNum(a[i]);
                System.out.println();
            }


        }


    }
} 


全部评论
肯定0%ac 跟你写的一样。。一直ac不了。
点赞 回复 分享
发布于 2016-09-06 10:26
你这里数组会越界的
点赞 回复 分享
发布于 2016-09-06 10:44
计算前面的求和,能用等比数列的公式就不要用求和吧,更加简化
点赞 回复 分享
发布于 2016-09-06 11:18
#include <iostream> #include <stdio.h> #include <math.h> using namespace std ; int main( int argc, const char * argv[]) {     long long int n;     while ( scanf ( "%lld" ,&n)!= EOF ){     int i,j;     for (i = 1 ; i <= 10000 ; i ++) {                  n -= powl ( 2 , i);         if (n<= 0 ) {             n+= powl ( 2 , i);             break ;         }     }     for (j = i- 1 ; j >= 0 ; j --) {         if ( powl ( 2 , j) >= n) {             printf ( "4" );         }         else {             printf ( "7" );             n -= powl ( 2 , j);         }     }         printf ( "\n" );     }     return 0 ; }
点赞 回复 分享
发布于 2016-09-06 11:20

相关推荐

不要0offer啊:浙江大学 加大加粗
点赞 评论 收藏
分享
03-02 10:51
邵阳学院 Java
红鲤鱼与绿鲤鱼i:看了你的头像不像找工作,像在找妹子
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务