A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 黑马-张超 于 2013-4-27 01:20 编辑

数据加密(思考题)
这个题综合程度较高,不会没关系,但是一定要先思考下,看看自己能想到哪些内容。最后我讲的时候听懂就行了。
某个公司采用公用电话传递数据信息,数据是小于8位的整数,为了确保安全,在传递过程中需要加密,加密规则如下:
首先将数据倒序,然后将每位数字都加上5,再用和除以10的余数代替该数字,最后将第一位和最后一位数字交换。
请任意给定一个小于8位的整数,然后,把加密后的结果在控制台打印出来。

例如:
int number = 123456;
/*
654321
10 9876
609871  
*/


没思路啊.求大神解释一下!

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

15 个回复

正序浏览
  1. package com.itcast.itheima;

  2. public class SecureAlgorithm {

  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args) {
  7.                 // TODO Auto-generated method stub
  8.                 SecureAlgorithm sa = new SecureAlgorithm();
  9.                 int[] arr = {1,2,3,4,5,6};
  10.                 arr = sa.encrypt(arr);
  11.                 sa.printArray(arr);
  12.         }

  13.         //加密算法
  14.         public int[] encrypt(int[] arr){

  15.                 int[] newArr = new int[arr.length];
  16.                
  17.                 for(int i=arr.length-1,j=0;j<newArr.length;i--,j++){
  18.                        
  19.                         //让每位数字+5
  20.                         newArr[j] = arr[i] + 5;
  21.                        
  22.                 }
  23.                 //求出总数
  24.                 int sum = sum(newArr);
  25.                 //求出%10余数
  26.                 mod(newArr);
  27.                
  28.                 return newArr;

  29.         }
  30.         //求模(求余)
  31.         private void mod(int[] arr){
  32.                
  33.                 for(int i=0;i<arr.length;i++){
  34.                         arr[i] = arr[i]%10;
  35.                 }

  36.         }
  37.        
  38.         //换位
  39.         public void swap(int[] arr,int i,int j){
  40.                
  41.                 int temp = arr[i];
  42.                 arr[i] = arr[j];
  43.                 arr[j] = temp;
  44.                
  45.         }
  46.        
  47.         //求最和
  48.         private int sum(int[] arr){
  49.                
  50.                 int sum = 0;
  51.                
  52.                 for(Integer i : arr){
  53.                         sum +=i;
  54.                 }
  55.                
  56.                 return sum;
  57.         }
  58.         //打印数组
  59.         public void printArray(int[] arr){

  60.                 for(Integer i : arr){
  61.                         System.out.print(i + ",");
  62.                 }
  63.                 System.out.println();
  64.         }

  65. }
复制代码
回复 使用道具 举报
这道题我也是今天早上才写出来的,和老师的相比,我的还是麻烦太多了.总是想不起来使用指针.
  1. public class Homework{

  2.         public static void main(String[] args){
  3.                 int num = 123456;
  4.                 //getNum(num);
  5.                 getNum2(num);
  6.         }

  7.         /*
  8.         首先将数据倒序,然后将每位数字都加上5,
  9.         再用和除以10的余数代替该数字,最后将第一位和最后一位数字交换。
  10.        
  11.         请任意给定一个小于等于8位的整数,然后,把加密后的结果在控制台打印出来。
  12.         例如:
  13.         int number = 123456;
  14.         654321
  15.         10 9876
  16.         609871

  17.         1%10

  18.         */
  19.         public static void getNum(int num){
  20.                 String str = num + "";
  21.                 char[] chs = str.toCharArray();
  22.                 if(chs.length > 8){
  23.                         System.out.println("输入有误,请输入1~8位有效数字");
  24.                 }else{
  25.                         for (int i = 0,j = chs.length - 1;i < j ;i++,j--){//数字反转
  26.                                 char temp = chs[i];
  27.                                 chs[i] = chs[j];
  28.                                 chs[j] = temp;
  29.                         }
  30.                         int sum = 0;
  31.                         int[] arr = new int[chs.length];
  32.                         for (int i = 0;i < chs.length;i++){
  33.                                 arr[i] = chs[i] -'0' + 5;//+5后
  34.                                 arr[i] = arr[i] % 10;//除10取余数
  35.                         }
  36.                         int t = arr[0];//交换首尾
  37.                         arr[0] = arr[arr.length - 1] ;
  38.                         arr[arr.length - 1] = t;
  39.                         for (int i = 0;i < arr.length;i++){
  40.                                 System.out.print(arr[i]);
  41.                         }
  42.                 }
  43.         }

  44.         public static void getNum2(int num){
  45.                 int[] arr = new int[8];
  46.                 int pos = 0;
  47.                 while(num > 0){
  48.                         arr[pos] = num % 10;
  49.                         num = num / 10;
  50.                         pos++;
  51.                 }
  52.                 for (int i = 0;i < pos;i++){
  53.                         arr[i] = arr[i] + 5;
  54.                         arr[i] = arr[i] % 10;
  55.                 }
  56.                 int temp = arr[0];
  57.                 arr[0] = arr[pos - 1];
  58.                 arr[pos - 1] = temp;
  59.                 for (int i = 0;i < pos;i++){
  60.                         System.out.print(arr[i]);
  61.                 }
  62.         }
  63. }
复制代码
第一个方法是我自己写的
回复 使用道具 举报
  1. import java.util.Scanner;
  2. class Day05 {
  3.         public static void main(String[] args) {
  4.                 //miMa();
  5.                 int num =  00006;
  6.                 getMi(num);
  7.         }

  8.         //求取密码
  9.         public static void miMa() {
  10.                 int[] arr = new int[8];
  11.                 jieShou(arr);
  12.                 reverse(arr);
  13.                 zhuanBian(arr);
  14.                 print(arr);
  15.         }

  16.         public static void jieShou(int[] arr) {
  17.                 System.out.println("请在下面输入数据: ");               
  18.                 for (int x = 0;x < arr.length;x++){
  19.                         Scanner sc = new Scanner(System.in);
  20.                         arr[x] = sc.nextInt();
  21.                         if (arr[x] > 10){
  22.                                 System.out.println("数据不合法!");
  23.                                 return ;
  24.                         }
  25.                 }
  26.         }

  27.         /*
  28.                 首先将数据倒序,然后将每位数字都加上5,再用和除以10的余数代替该数字,最后将第一位和最后一位数字交换。
  29.                 请任意给定一个小于8位的整数,然后,把加密后的结果在控制台打印出来。

  30.                 例如:
  31.                 int number = 123456;

  32.                 654321
  33.                 10 9876
  34.                 609871  
  35.         */

  36.         //将数组中的内容反转
  37.         public static void reverse(int[] arr) {
  38.                 for (int start = 0,end = arr.length - 1;end > start;start++,end--){
  39.                         int temp = arr[start];
  40.                         arr[start] = arr[end];
  41.                         arr[end] = temp;
  42.                 }
  43.         }

  44.         //将每位数字都加上5,再用和除以10的余数代替该数字
  45.         public static void zhuanBian(int[] arr) {
  46.                 for (int i = 0;i < arr.length;i++){
  47.                         arr[i]=((arr[i] + 5) % 10);
  48.                 }
  49.                 int temp = arr[0];
  50.                 arr[0] = arr[7];
  51.                 arr[7] = temp;
  52.         }

  53.         //打印输出数组
  54.         public static void print(int[] arr) {
  55.                 //String s = "";
  56.                 for (int i = 0;i <arr.length;i++){
  57.                         //s = s + arr[i];
  58.                         System.out.print(arr[i]);
  59.                 }
  60.                 System.out.println();
  61.                 //System.out.println(s);
  62.         }
  63.         public static void getMi(int num) {
  64.                 int[] arr = new int[8];
  65.                 int pos = 0;
  66.                 while (num != 0){
  67.                         arr[pos] = num % 10;
  68.                         num = num / 10;
  69.                         pos++;
  70.                 }
  71.                 for (int i = 0;i < pos ;i++){
  72.                         arr[i] = arr[i] + 5;
  73.                         arr[i] = arr[i] % 10;
  74.                 }
  75.                 int temp = arr[0];
  76.                 arr[0] = arr[pos - 1];
  77.                 arr[pos - 1] = temp;
  78.                 for (int i = 0;i < pos ;i++){
  79.                         System.out.print(arr[i]);
  80.                 }
  81.         }

  82. }
复制代码
这个是我写出来的代码,有两种方法,第一种是从键盘输入8个数据,只能做8个的,不过有一点bug,每当输入的不是8个数字报错的时候输出总是不正确
第二种方法是直接接收一个数字,然后把密码算出来。不过也有点不好,如果我想算000001 以0开头的数字,是没办法算的···
回复 使用道具 举报
本帖最后由 ~与狼共舞~ 于 2013-4-26 21:51 编辑
  1. class Test {
  2.         public static void main(String[] args) {
  3.                 int num = 123456;
  4.                 getMi(num);
  5.         }
  6.         public static void getMi(int num) {
  7.                 //定义一个数组,根据题的意思定义了一个长度是8的int数组
  8.                 int[] arr = new int[8];
  9.                 //为了操作这个数组,定义了指针
  10.                 int pos = 0;
  11.                 //如果你传入的数大于0的话,我就给你进行加密
  12.                 while (num > 0){
  13.                         //通过变化角标值,把num%10的结果都存放在数组中
  14.                         arr[pos] = num % 10;
  15.                         //获取每一个位数上的数
  16.                         num = num / 10;
  17.                         //改变pos指向的位置
  18.                         pos++;
  19.                 }
  20.                 //定义循环,把数组中的元素遍历,然后操作
  21.                 for (int x = 0;x < pos;x++){
  22.                         //让每个元素都加上5
  23.                         arr[x] = arr[x] + 5;
  24.                         //让每个元素都模10
  25.                         arr[x] = arr[x] % 10;
  26.                 }
  27.                 //交换头尾角标里的数值
  28.                 int temp = arr[0];
  29.                 arr[0] = arr[pos -1];
  30.                 arr[pos -1] = temp;
  31.                 //遍历输出
  32.                 for (int x = 0;x < pos; x++){
  33.                         System.out.print(arr[x]);
  34.                 }
  35.         }
  36. }
复制代码

点评

代码很简练,while(num>0)的停止条件更好一些!  发表于 2013-4-28 21:24
回复 使用道具 举报
本帖最后由 Neverbelazy 于 2013-4-28 21:21 编辑

1. 先得到各个位的数,存入一个数组;
     1.1 先定义一个足够装8位数的数组int[] arr,定义一个length=0记录位数
     1.2 for循环
  1.           for(int x=0;number<10;x++){
  2.            arr[x]=number%10;//- number%10得到最低位;存入数组
  3.            number=number/10;
  4.            length++;
  5.            }
复制代码
1.3 停止条件: number<10
      1.4 将最后一位 number存入数组 ++length
  1.             arr[++length]=number;
复制代码
2.遍历数组  进行+5 %10加密
  1.        for(int x=0;x<=length;x++){
  2.             arr[x]=(arr[x]+5)%10;
  3.        }
复制代码
3. 交换最高最低位
  1.        temp=arr[0];
  2.        arr[0]=arr[length-1];
  3.        arr[length-1]=temp;
复制代码
4. 得到最后加密的元素
  1.      int newNumber=0;
  2.      for(int x=0;x<length;x++){
  3.              newNumber=newNumber*10;     //无需判断高位是否为0, 0*10=0
  4.              newNumber+=arr[length-1-x];
  5.       }     
复制代码

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

回复 使用道具 举报
看了大家的思路,我补充一点分解目标整数,不足的地方,请大家多多指教:
1,将目标整数依次分解,比如说目标整数是n位且n<=8;则将目标整数除以10的(n-1)次方,将所得的商存入之前已经定义的数组。将所得的余数(注意用模运算所得的值)除以10的(n-2)次方,将所得的商存入相应数组,依次循环下去。即可分解目标整数。注意:此时数组里的数顺序已经是逆序了。
2,其他步骤和7楼一样。

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

回复 使用道具 举报
这是我自己写的一个方法, 你贴在类里面运行一下
/*
int number = 123456;

654321
10 9876
609871  
*/
        //定义一个方法用来实现题目的功能
        public static void encrypt(int[] arr) {
                reversalSort(arr);
                for (int i = 0; i < arr.length; i++) {        //循环把数组里面的值全部加上5
                        arr[i] += 5;                                               
                        if (arr[i] > 9) {                                        //大于10的值取模放入数组
                                arr[i] %= 10;
                        }
                }
                //将数组里第一个值与最后一个互换
                int temp = arr[0];
                arr[0] = arr[arr.length - 1];
                arr[arr.length - 1] = temp;

                for (int i = 0; i < arr.length; i++) {
                        System.out.print(arr[i] + "");
                }
        }
        //定义了一个把数组里面的值反过来的方法
        public static void reversalSort(int[] arr) {
                for (int start = 0, end = arr.length - 1; start < end; start++, end--) {
                        swap1(arr, start, end);
                }
        }

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

回复 使用道具 举报
  1.        
  2.         public static void main(String[] args) {
  3.                
  4.                 System.out.println(getValue(123456));
  5.         }
  6.        
  7.         public static String getValue(int number){
  8.                 List<Integer> intList = new ArrayList<Integer>();
  9.                
  10.                 int numberCopy = number;
  11.                
  12.                 while(numberCopy > 0){
  13.                         intList.add(numberCopy % 10);
  14.                         numberCopy = numberCopy / 10 ;
  15.                 }
  16.                
  17.                 ListIterator<Integer> lit = intList.listIterator();
  18.                
  19.                 while(lit.hasNext()){
  20.                         lit.set((lit.next() + 5 )%10);
  21.                 }
  22.                
  23.                 int tempNumber = intList.get(0);
  24.                
  25.                 intList.set(0, intList.get(intList.size() - 1));
  26.                
  27.                 intList.set(intList.size() - 1, tempNumber);
  28.                
  29.                 StringBuilder sb = new StringBuilder();
  30.                
  31.                 for(Integer i: intList){
  32.                         sb.append(i);
  33.                 }
  34.                
  35.                 return sb.toString();
  36.         }
  37.        
复制代码

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

回复 使用道具 举报
你是上的基础班吧
回复 使用道具 举报
刘凯 金牌黑马 2013-4-25 21:32:21
7#
黑马-张超 发表于 2013-4-25 21:15
这是今天我们老师给我们留的一道思考题,可是一点思路都没有,求大神给解析一下! ...


我说下我的思路 ,可能不是最好的

1,将给定的这个整数各个位上的数字得到 (这个应该会吧) ,然后每位加上5,再然后%10 获取余数,再以相反的顺序将该余数写入一个ArrayList集合
2.调用colletions的reverse方法反转集合  
3,然后调用ArrayList的get 和 set方法将集合中的最后一位,和第一位数字交换
4,遍历集合,每一位呈上响应10的倍数 得到加密后的数字
5,打印


这个其实也可以用数组来完成,但是java貌似没有提供数组的reverse方法,需要自己写一个反转方法

回复 使用道具 举报
黑马-张超 发表于 2013-4-25 21:15
这是今天我们老师给我们留的一道思考题,可是一点思路都没有,求大神给解析一下! ...


我说下我的思路 ,可能不是最好的

1,将给定的这个整数各个位上的数字得到 (这个应该会吧) ,然后每位加上5,再然后%10 获取余数,再以相反的顺序将该余数写入一个ArrayList集合
2.调用colletions的reverse方法反转集合  
3,然后调用ArrayList的get 和 set方法将集合中的最后一位,和第一位数字交换
4,遍历集合,每一位呈上响应10的倍数 得到加密后的数字
5,打印


这个其实也可以用数组来完成,但是java貌似没有提供数组的reverse方法,需要自己写一个反转方法

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

回复 使用道具 举报
  1. import java.util.Arrays;
  2. class lianxi {
  3.         public static void main(String[] args) {
  4.                 int[] arr = {1,2,3,4,5,6};
  5.                 fanZhuan(arr);
  6.                 yunsuan(arr);
  7.                 swap(arr);
  8.                 System.out.println(Arrays.toString(arr));
  9.         }
  10.         //倒序
  11.         public static void fanZhuan(int[] a){
  12.                 int min = 0;
  13.                 int max = a.length - 1;
  14.                 while (min < max){
  15.                         int temp = a[min];
  16.                         a[min] = a[max];
  17.                         a[max] = temp;
  18.                         min++;
  19.                         max--;
  20.                 }
  21.         }
  22.         //加5,除10取余
  23.         public static void yunsuan(int[] a){
  24.                 for (int i = 0;i < a.length ;i ++ ){
  25.                         a[i] += 5;
  26.                         a[i] = a[i] % 10;
  27.                 }
  28.         }
  29.         //交换第一和最后一位数字
  30.         public static void swap(int[] a){
  31.                 int temp = a[0];
  32.                 a[0] = a[a.length - 1];
  33.                 a[a.length - 1] = temp;
  34.                 }
  35.         //输出数组
  36.         public static void print(int[] a){
  37.                 String s = "[";
  38.                         for (int i = 0;i < a.length ;i ++ ){                               
  39.                                 if( i != a.length - 1){
  40.                                         s = s + a[i] + ",";
  41.                                 }else{
  42.                                         s = s + a[i] + "]";
  43.                                 }
  44.                         }
  45.                         System.out.println(s);
  46.                 }       
  47. }
复制代码
又马虎了一次,那个交换函数写错了这个是正确的
回复 使用道具 举报
这是我自习写的,好像有点问题,一起改改。
  1. import java.util.Arrays;
  2. class lianxi {
  3.         public static void main(String[] args) {
  4.                 int[] arr = {1,2,3,4,5,6};
  5.                 fanZhuan(arr);
  6.                 yunsuan(arr);
  7.                 swap(arr);
  8.                 System.out.println(Arrays.toString(arr));
  9.         }
  10.         //倒序
  11.         public static void fanZhuan(int[] a){
  12.                 int min = 0;
  13.                 int max = a.length - 1;
  14.                 while (min < max){
  15.                         int temp = a[min];
  16.                         a[min] = a[max];
  17.                         a[max] = temp;
  18.                         min++;
  19.                         max--;
  20.                 }
  21.         }
  22.         //加5,除10取余
  23.         public static void yunsuan(int[] a){
  24.                 for (int i = 0;i < a.length ;i ++ ){
  25.                         a[i] += 5;
  26.                         a[i] = a[i] % 10;
  27.                 }
  28.         }
  29.         //交换第一和最后一位数字
  30.         public static void swap(int[] a){
  31.                 int temp = a[0];
  32.                 a[0] = a[a.length - 1];
  33.                 a[a.length - 1] = a[0];
  34.                 }
  35.         //输出数组
  36.         public static void print(int[] a){
  37.                 String s = "[";
  38.                         for (int i = 0;i < a.length ;i ++ ){                               
  39.                                 if( i != a.length - 1){
  40.                                         s = s + a[i] + ",";
  41.                                 }else{
  42.                                         s = s + a[i] + "]";
  43.                                 }
  44.                         }
  45.                         System.out.println(s);
  46.                 }       
  47. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

回复 使用道具 举报
这是今天我们老师给我们留的一道思考题,可是一点思路都没有,求大神给解析一下!
回复 使用道具 举报
这是今天我们老师给我们留的一道思考题,可是一点思路都没有,求大神给解析一下!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马