洛谷题目:P1618 三连击(升级版)
题目如下:
我的代码:
package 算法竞赛;
import java.io.*;
import java.util.Arrays;
/*
思路:由i得出其余两个数,然后判断即可,别忘了count=0时,输出No!!!
*/
public class Test3{
static StringBuilder str = new StringBuilder();
static BufferedReader ins = new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer in = new StreamTokenizer(ins);
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException{
int[] ints = new int[10]; // 该数组用来判断1到9的数字是否重复
in.nextToken(); // 接收数据
int a = (int)in.nval;
in.nextToken();
int b = (int)in.nval;
in.nextToken();
int c = (int)in.nval;
int z = a+b+c;
int k = 0;
int count = 0;
for(int i = 123;i<330;i++) // 因为不能重复且不能为0,所以从123开始,而A<B<C,所以A最大333,
{
// 但是根据题意最大329,所以<330
int j = (int)(i*1.0/a*b); // 由i得出其余两个数字
int m = (int)(i*1.0/a*c);
Arrays.fill(ints,0); // 清理数组,以防判断出错
ints[i%10]++; // 对应的下标++
ints[i/10%10]++;
ints[i/100%10]++;
ints[j%10]++;
ints[j/10%10]++;
ints[j/100%10]++;
ints[m%10]++;
ints[m/10%10]++;
ints[m/100%10]++;
for(int t1 = 1;t1<ints.length;t1++)
{
if(ints[t1]!=1) // 如果有不为1的,那就continue,看下一个
{
k = 1;
break;
}
}
if(k==1) // 如果k==1,那就是说明这里有不符合题意的,那就看下一个
{
k = 0; // 别忘了别k变回来,所以 k = 0
continue;
}
count++; // 能到这里说明符合题意,所以count++
str.append(i+" "+j+" "+m+" "+"\n"); // 记录应该输出的数据
}
if(count == 0) // 判断输出
{
System.out.println("No!!!");
System.exit(0); // 其实不用提前结束的,但是为了使逻辑通常,写上这句
}
out.print(str); // 输出数据
out.close();
}
}
1、能直接用式子得出的,直接用式子表示
2、如果几个数成比例,则取某一个数,然后让该数*1.0再除以自己的比率,再乘以其他数即可得到对应的其他数,别忘了强制类型转换(int)
如有谬误,请务必告知,以免误导他人