1. 随机产生验证码:
给定一个长度,随机产生一个该长度的字符串,由大写,小写字母以及数字组成
方法一:查表法实现随机产生验证码
public static String CodeTest(Random random){
String str="";
char[] letNum=new char[]{'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q',
'R','S','T','U','V','W','X','Y','Z','a','b','c','e','f','g','h','i','j','k','l','m','n',
'o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9'};
int index;
boolean[] flag=new boolean[letNum.length]; //默认是false
for(int i=0;i<4;i++){
do{
index=random.nextInt(letNum.length);
}while(flag[index]==true);
char ch=letNum[index];
str+=ch;
flag[index]=true;
}
return str;
}
方法二:switch语句实现随机产生验证码(推荐使用)
public static String RandomCode(Random rand){
String str="";
for(int i=0;i<4;i++){
int num=rand.nextInt(3);
switch(num){
case 0:
char upper=(char)(rand.nextInt(26)+'A');
str+=upper;
break;
case 1:
char low=(char)(rand.nextInt(26)+'a');
str+=low;
break;
case 2:
str+=rand.nextInt(10);
}
}
return str;
}
方法三:直接使用字符串实现随机产生验证码,用到了StringBuffer构造器,代码优化了,比方法一好用
public static String RandomStr(Random rand,int length){
String str="1234567890ABCDEFGHIJKMLNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
StringBuffer sb=new StringBuffer();
for(int i=0;i<length;i++){
int num=rand.nextInt(62);
sb.append(str.charAt(num));
}
String newStr=sb.toString();
return newStr;
}
主方法:
public static void main(String[] args) {
// TODO Auto-generated method stub
Random random=new Random();
String str=CodeTest(random);
System.out.println();
System.out.println(str);
String str2=RandomCode(random);
System.out.println(str2);
String str3=RandomStr(random,4);
System.out.println(str3);
}
2. 条码的验证
问题描述:验证ean-13条码的验证码是否正确
String code = "6921168509256";
取前12位的奇数位的和
取前12位的偶数位的和
将"奇数位和"与"偶数位和的三倍"相加求和
取和的个位数,然后用10减去这个个位数,相减的结果就是条码的验证码
如果条码的第13位数字和这个验证码相同就说明验证码正确
分析:我们拿到的是字符串,不好做判断,所以首先需要把字符串转为可计算的整型数组,字符串不能直接转整形数组,这里借助字符数组进行转换;然后按要求分别取到寄数位与偶数位的元素并求和;得到条码的验证码并与条码的最后一位作比较。
代码实现:
public class CodeTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
String code="6921168509256";
char[] chrr=code.toCharArray();
Code(chrr);
if(Code(chrr)){
System.out.println("验证码正确!");
}
else{
System.out.println("验证码错误!");
}
}
public static boolean Code(char[] ch){
int[]a=new int[ch.length];
int[] arr=new int[12]; //保存偶数位元素
int[] brr=new int[12]; //保存奇数位元素
int j=0,aindex=0,bindex=0;
int asum=0,bsum=0;
for(char temp:ch){ //字符数组转整型数组
a[j++]=Integer.parseInt(String.valueOf(temp));
}
for(int i=0;i<a.length-1;i++){
if((i+1)%2==0){ //判断偶数位
arr[aindex++]=a[i];
}
else{
brr[bindex++]=a[i];
}
}
for(int i=0;i<arr.length;i++){
asum+=arr[i]; //偶数位和
}
for(int i=0;i<brr.length;i++){
bsum+=brr[i]; //奇数位和
}
int sum=asum*3+bsum;
int num=10-(sum%10); //得到条码的验证码
if(num==a[a.length-1])
return true;
else
return false;
}
}
优化代码:注解使用字符串实现
public class CodeTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
String code="6921168509256";
if(Code(code)){
System.out.println("验证码正确!");
}
else{
System.out.println("验证码错误!");
}
}
public static boolean Code(String str){
int s1=0,s2=0,sum=0;
for(int i=0;i<str.langth();i++){
if((i+1)%2==0)
s1=s1+(str.charAt(i)-48); // 偶数位元素之和
else
s2=s2+(str.charAt(i)-48); // 奇数位元素之和
}
sum=s1*3+s1;
int code=10-sum&10;
int num=str.charAt(12)-48; //取条码的最后一位数
if(code==num)
return true;
else
return false;
}
}