import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int cnt = scanner.nextInt();
while(cnt-->0){
boolean flag = false;
int num = scanner.nextInt();
int s4 = num/4;
int s7 = num/7;
int i , j=0;
for (i=0; i<=s4; i++){
for (j=0; j<=s7; j++){
if (i*4+j*7==num){
flag = true;
break;
}
}
if (flag) break;
}
if (!flag)
System.out.println(-1);
else{
for (int k=0; k<i; k++)
System.out.print(4);
for (int k=0; k<j; k++)
System.out.print(7);
System.out.println();
}
}
}
}
大概给个O(n)的解法,用欧几里得扩展的话,时间复杂度还可以降低,参考链接给了,有兴趣的话,自己看一下
public int getMin(int t){
if(t<4)
return -1;
// 4*x+7*y=t
//思路是,在有解的情况,希望4尽可能的多,7尽可能少,那我们枚举出7的个数,就能进一步求得4的个数了
//印象中,不定式的整数解是有公式的叫做不定方程的同余公式(欧几里得扩展)
// (y mod a)/gcd(a,b)
for(int ky = 0; ky<t; ky+=7){
int kx = t-ky;
if(kx%4!=0) continue;
int ans = 0;
int x = kx/4;
int y = ky/7;
for(int i = 0; i < x; i++){
ans = ans*10+4;
}
for(int i = 0; i < y; i++){
ans = ans*10+7;
}
return ans;
}
return -1;
}