黑马程序员技术交流社区
标题:
一道关于数组的问题,一点思路都没有.求解!
[打印本页]
作者:
黑马-张超
时间:
2013-4-25 21:08
标题:
一道关于数组的问题,一点思路都没有.求解!
本帖最后由 黑马-张超 于 2013-4-27 01:20 编辑
数据加密(思考题)
这个题综合程度较高,不会没关系,但是一定要先思考下,看看自己能想到哪些内容。最后我讲的时候听懂就行了。
某个公司采用公用电话传递数据信息,数据是小于8位的整数,为了确保安全,在传递过程中需要加密,加密规则如下:
首先将数据倒序,然后将每位数字都加上5,再用和除以10的余数代替该数字,最后将第一位和最后一位数字交换。
请任意给定一个小于8位的整数,然后,把加密后的结果在控制台打印出来。
例如:
int number = 123456;
/*
654321
10 9876
609871
*/
没思路啊.求大神解释一下!
作者:
黑马-张超
时间:
2013-4-25 21:15
这是今天我们老师给我们留的一道思考题,可是一点思路都没有,求大神给解析一下!
作者:
黑马-张超
时间:
2013-4-25 21:16
这是今天我们老师给我们留的一道思考题,可是一点思路都没有,求大神给解析一下!
作者:
张迁
时间:
2013-4-25 21:26
这是我自习写的,好像有点问题,一起改改。
import java.util.Arrays;
class lianxi {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6};
fanZhuan(arr);
yunsuan(arr);
swap(arr);
System.out.println(Arrays.toString(arr));
}
//倒序
public static void fanZhuan(int[] a){
int min = 0;
int max = a.length - 1;
while (min < max){
int temp = a[min];
a[min] = a[max];
a[max] = temp;
min++;
max--;
}
}
//加5,除10取余
public static void yunsuan(int[] a){
for (int i = 0;i < a.length ;i ++ ){
a[i] += 5;
a[i] = a[i] % 10;
}
}
//交换第一和最后一位数字
public static void swap(int[] a){
int temp = a[0];
a[0] = a[a.length - 1];
a[a.length - 1] = a[0];
}
//输出数组
public static void print(int[] a){
String s = "[";
for (int i = 0;i < a.length ;i ++ ){
if( i != a.length - 1){
s = s + a[i] + ",";
}else{
s = s + a[i] + "]";
}
}
System.out.println(s);
}
}
复制代码
作者:
张迁
时间:
2013-4-25 21:29
import java.util.Arrays;
class lianxi {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6};
fanZhuan(arr);
yunsuan(arr);
swap(arr);
System.out.println(Arrays.toString(arr));
}
//倒序
public static void fanZhuan(int[] a){
int min = 0;
int max = a.length - 1;
while (min < max){
int temp = a[min];
a[min] = a[max];
a[max] = temp;
min++;
max--;
}
}
//加5,除10取余
public static void yunsuan(int[] a){
for (int i = 0;i < a.length ;i ++ ){
a[i] += 5;
a[i] = a[i] % 10;
}
}
//交换第一和最后一位数字
public static void swap(int[] a){
int temp = a[0];
a[0] = a[a.length - 1];
a[a.length - 1] = temp;
}
//输出数组
public static void print(int[] a){
String s = "[";
for (int i = 0;i < a.length ;i ++ ){
if( i != a.length - 1){
s = s + a[i] + ",";
}else{
s = s + a[i] + "]";
}
}
System.out.println(s);
}
}
复制代码
又马虎了一次,那个交换函数写错了这个是正确的
作者:
刘凯
时间:
2013-4-25 21:32
黑马-张超 发表于 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:32
黑马-张超 发表于 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:45
你是上的基础班吧
作者:
刘子义
时间:
2013-4-25 22:06
public static void main(String[] args) {
System.out.println(getValue(123456));
}
public static String getValue(int number){
List<Integer> intList = new ArrayList<Integer>();
int numberCopy = number;
while(numberCopy > 0){
intList.add(numberCopy % 10);
numberCopy = numberCopy / 10 ;
}
ListIterator<Integer> lit = intList.listIterator();
while(lit.hasNext()){
lit.set((lit.next() + 5 )%10);
}
int tempNumber = intList.get(0);
intList.set(0, intList.get(intList.size() - 1));
intList.set(intList.size() - 1, tempNumber);
StringBuilder sb = new StringBuilder();
for(Integer i: intList){
sb.append(i);
}
return sb.toString();
}
复制代码
作者:
breeze
时间:
2013-4-25 22:53
这是我自己写的一个方法, 你贴在类里面运行一下
/*
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);
}
}
作者:
曾德强
时间:
2013-4-25 23:24
看了大家的思路,我补充一点分解目标整数,不足的地方,请大家多多指教:
1,将目标整数依次分解,比如说目标整数是n位且n<=8;则将目标整数除以10的(n-1)次方,将所得的商存入之前已经定义的数组。将所得的余数(注意用模运算所得的值)除以10的(n-2)次方,将所得的商存入相应数组,依次循环下去。即可分解目标整数。注意:此时数组里的数顺序已经是逆序了。
2,其他步骤和7楼一样。
作者:
Neverbelazy
时间:
2013-4-26 14:12
本帖最后由 Neverbelazy 于 2013-4-28 21:21 编辑
1. 先得到各个位的数,存入一个数组;
1.1 先定义一个足够装8位数的数组int[] arr,定义一个length=0记录位数
1.2 for循环
for(int x=0;number<10;x++){
arr[x]=number%10;//- number%10得到最低位;存入数组
number=number/10;
length++;
}
复制代码
1.3 停止条件: number<10
1.4 将最后一位 number存入数组 ++length
arr[++length]=number;
复制代码
2.遍历数组 进行+5 %10加密
for(int x=0;x<=length;x++){
arr[x]=(arr[x]+5)%10;
}
复制代码
3. 交换最高最低位
temp=arr[0];
arr[0]=arr[length-1];
arr[length-1]=temp;
复制代码
4. 得到最后加密的元素
int newNumber=0;
for(int x=0;x<length;x++){
newNumber=newNumber*10; //无需判断高位是否为0, 0*10=0
newNumber+=arr[length-1-x];
}
复制代码
作者:
~与狼共舞~
时间:
2013-4-26 21:13
本帖最后由 ~与狼共舞~ 于 2013-4-26 21:51 编辑
class Test {
public static void main(String[] args) {
int num = 123456;
getMi(num);
}
public static void getMi(int num) {
//定义一个数组,根据题的意思定义了一个长度是8的int数组
int[] arr = new int[8];
//为了操作这个数组,定义了指针
int pos = 0;
//如果你传入的数大于0的话,我就给你进行加密
while (num > 0){
//通过变化角标值,把num%10的结果都存放在数组中
arr[pos] = num % 10;
//获取每一个位数上的数
num = num / 10;
//改变pos指向的位置
pos++;
}
//定义循环,把数组中的元素遍历,然后操作
for (int x = 0;x < pos;x++){
//让每个元素都加上5
arr[x] = arr[x] + 5;
//让每个元素都模10
arr[x] = arr[x] % 10;
}
//交换头尾角标里的数值
int temp = arr[0];
arr[0] = arr[pos -1];
arr[pos -1] = temp;
//遍历输出
for (int x = 0;x < pos; x++){
System.out.print(arr[x]);
}
}
}
复制代码
作者:
邹晓慧
时间:
2013-4-26 21:18
import java.util.Scanner;
class Day05 {
public static void main(String[] args) {
//miMa();
int num = 00006;
getMi(num);
}
//求取密码
public static void miMa() {
int[] arr = new int[8];
jieShou(arr);
reverse(arr);
zhuanBian(arr);
print(arr);
}
public static void jieShou(int[] arr) {
System.out.println("请在下面输入数据: ");
for (int x = 0;x < arr.length;x++){
Scanner sc = new Scanner(System.in);
arr[x] = sc.nextInt();
if (arr[x] > 10){
System.out.println("数据不合法!");
return ;
}
}
}
/*
首先将数据倒序,然后将每位数字都加上5,再用和除以10的余数代替该数字,最后将第一位和最后一位数字交换。
请任意给定一个小于8位的整数,然后,把加密后的结果在控制台打印出来。
例如:
int number = 123456;
654321
10 9876
609871
*/
//将数组中的内容反转
public static void reverse(int[] arr) {
for (int start = 0,end = arr.length - 1;end > start;start++,end--){
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
}
}
//将每位数字都加上5,再用和除以10的余数代替该数字
public static void zhuanBian(int[] arr) {
for (int i = 0;i < arr.length;i++){
arr[i]=((arr[i] + 5) % 10);
}
int temp = arr[0];
arr[0] = arr[7];
arr[7] = temp;
}
//打印输出数组
public static void print(int[] arr) {
//String s = "";
for (int i = 0;i <arr.length;i++){
//s = s + arr[i];
System.out.print(arr[i]);
}
System.out.println();
//System.out.println(s);
}
public static void getMi(int num) {
int[] arr = new int[8];
int pos = 0;
while (num != 0){
arr[pos] = num % 10;
num = num / 10;
pos++;
}
for (int i = 0;i < pos ;i++){
arr[i] = arr[i] + 5;
arr[i] = arr[i] % 10;
}
int temp = arr[0];
arr[0] = arr[pos - 1];
arr[pos - 1] = temp;
for (int i = 0;i < pos ;i++){
System.out.print(arr[i]);
}
}
}
复制代码
这个是我写出来的代码,有两种方法,第一种是从键盘输入8个数据,只能做8个的,不过有一点bug,每当输入的不是8个数字报错的时候输出总是不正确
第二种方法是直接接收一个数字,然后把密码算出来。不过也有点不好,如果我想算000001 以0开头的数字,是没办法算的···
作者:
王梦南
时间:
2013-4-26 22:11
这道题我也是今天早上才写出来的,和老师的相比,我的还是麻烦太多了.总是想不起来使用指针.
public class Homework{
public static void main(String[] args){
int num = 123456;
//getNum(num);
getNum2(num);
}
/*
首先将数据倒序,然后将每位数字都加上5,
再用和除以10的余数代替该数字,最后将第一位和最后一位数字交换。
请任意给定一个小于等于8位的整数,然后,把加密后的结果在控制台打印出来。
例如:
int number = 123456;
654321
10 9876
609871
1%10
*/
public static void getNum(int num){
String str = num + "";
char[] chs = str.toCharArray();
if(chs.length > 8){
System.out.println("输入有误,请输入1~8位有效数字");
}else{
for (int i = 0,j = chs.length - 1;i < j ;i++,j--){//数字反转
char temp = chs[i];
chs[i] = chs[j];
chs[j] = temp;
}
int sum = 0;
int[] arr = new int[chs.length];
for (int i = 0;i < chs.length;i++){
arr[i] = chs[i] -'0' + 5;//+5后
arr[i] = arr[i] % 10;//除10取余数
}
int t = arr[0];//交换首尾
arr[0] = arr[arr.length - 1] ;
arr[arr.length - 1] = t;
for (int i = 0;i < arr.length;i++){
System.out.print(arr[i]);
}
}
}
public static void getNum2(int num){
int[] arr = new int[8];
int pos = 0;
while(num > 0){
arr[pos] = num % 10;
num = num / 10;
pos++;
}
for (int i = 0;i < pos;i++){
arr[i] = arr[i] + 5;
arr[i] = arr[i] % 10;
}
int temp = arr[0];
arr[0] = arr[pos - 1];
arr[pos - 1] = temp;
for (int i = 0;i < pos;i++){
System.out.print(arr[i]);
}
}
}
复制代码
第一个方法是我自己写的
作者:
黄茂霖
时间:
2013-4-26 23:50
package com.itcast.itheima;
public class SecureAlgorithm {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SecureAlgorithm sa = new SecureAlgorithm();
int[] arr = {1,2,3,4,5,6};
arr = sa.encrypt(arr);
sa.printArray(arr);
}
//加密算法
public int[] encrypt(int[] arr){
int[] newArr = new int[arr.length];
for(int i=arr.length-1,j=0;j<newArr.length;i--,j++){
//让每位数字+5
newArr[j] = arr[i] + 5;
}
//求出总数
int sum = sum(newArr);
//求出%10余数
mod(newArr);
return newArr;
}
//求模(求余)
private void mod(int[] arr){
for(int i=0;i<arr.length;i++){
arr[i] = arr[i]%10;
}
}
//换位
public void swap(int[] arr,int i,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//求最和
private int sum(int[] arr){
int sum = 0;
for(Integer i : arr){
sum +=i;
}
return sum;
}
//打印数组
public void printArray(int[] arr){
for(Integer i : arr){
System.out.print(i + ",");
}
System.out.println();
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2