求助!数据结构题.
题目如下,要求用java语言编程...以正整数n,i,k作为输入,其中n,i,k>0,且i<n。假定数1,2,…,n是环形排列的。试编写一个程序,从数i开始,按顺时针方向以k为步长打印数,当打印某个数时,应从环中删去该数,这样的过程一直进行到环空为止。例如,当n=10,i=1,k=3时,得到的输出序列是3,6,9,2,7,1,8,5,10,4。
小弟才疏学浅...
写了个如下方法 后面就不会了
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/*
* 12345678910
n=10 k=3 i=1
1st
369 剩 12457810
2nd
2(10 1后)7(4,5后)1(8,10后)
*/
public class Subject1 {
public static void main(String[] args){
Scanner inputI = new Scanner(System.in);
Scanner inputN = new Scanner(System.in);
Scanner inputK = new Scanner(System.in);
System.out.print("请输入起始数i:");
int i = inputI.nextInt();
System.out.print("请输入结尾数n:");
int n = inputN.nextInt();
System.out.print("请输入步进数k:");
int k = inputK.nextInt();
//两数组用于存储
List<Integer> list = new ArrayList();
List<Integer> list2 = new ArrayList();
//参数j,循环出i至n
for(int j = i;j <= n;i++){
list.add(j++);
}
for(int j=0;j<list.size();j++){
System.out.print(list.get(j) + " ");
}
System.out.println();//行控制
for(int j=0;j<list.size();j++){
//m 转化数组元素
int m = list.get(j);
// System.out.print(m + " ");
if(m%3==0){
list.remove(j);
list2.add(m);
}
}
// System.out.println();//行控制
//
for(int j=0;j<list.size();j++){
System.out.print(list.get(j) + " ");
}
System.out.println();//行控制
for(int j=0;j<list2.size();j++){
System.out.print(list2.get(j) + " ");
}
}
} --------------------编程问答-------------------- 挺好的,拉易做图看什么你奶奶 --------------------编程问答-------------------- 自己顶下了,哎 --------------------编程问答--------------------
package Luzhou;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/*
* 12345678910
n=10 k=3 i=1
1st
369 剩 12457810
2nd
2(10 1后)7(4,5后)1(8,10后)
*/
public class Subject1 {
public static void main(String[] args){
Scanner inputI = new Scanner(System.in);
Scanner inputN = new Scanner(System.in);
Scanner inputK = new Scanner(System.in);
// System.out.print("请输入起始数i:");
// int i = inputI.nextInt();
// System.out.print("请输入结尾数n:");
// int n = inputN.nextInt();
// System.out.print("请输入步进数k:");
// int k = inputK.nextInt();
//测试数据
int i = 1;
int n = 10;
int k = 3;
//两数组用于存储
List<Integer> list = new ArrayList();
List<Integer> list2 = new ArrayList();
List<Integer> combine = new ArrayList();
List<Integer> combine2 = new ArrayList();
List<Integer> key = new ArrayList();
//循环取出i至n的集合
for(int j = i;j <= n;i++){
list.add(j++);
}
//查看list集合
System.out.print("最初的原始数组list:");
for(int j=0;j<list.size();j++){
System.out.print(list.get(j) + " ");
}
System.out.println();//行控制
for(int j=1;j<list.size();j++){
//m 转化数组元素
int m = list.get(j-1);
// System.out.print(m + " ");
if(j%3==0){
key.add(j);
}
}
//查看list集合
System.out.print("新原始数组list:");
for(int j=0;j<list.size();j++){
System.out.print(list.get(j) + " ");
}
System.out.println();//行控制
//查看答案数据
System.out.print("答案数组key:");
for(int j=0;j<key.size();j++){
System.out.print(key.get(j) + " ");
}
System.out.println();//行控制
list2.addAll(list);
list2.removeAll(key);
//查看list2集合
System.out.print("去除key数组的list2:");
for(int j=0;j<list2.size();j++){
System.out.print(list2.get(j) + " ");
}
System.out.println();//行控制
combine.addAll(list);
combine.addAll(list2);
//查看合并后的combine数组
System.out.print("新的combine数组1:");
for(int j=0;j<combine.size();j++){
System.out.print(combine.get(j) + " ");
}
/*
* i=1234567891011121314151617
* k++;
if((k*3)<combine.size()){
k++;
}
combine.remove(k*3);
combine2.addAll(combine);&&j<=combine.size()
*/
combine2.addAll(combine);
int y = 0;
for(int j=1;j<=combine2.size();j++){ //循环17次,在此循环中去掉3的倍数
if(j%3==0){
y++;
combine.remove(j-y);//j-1 -2 -3 -4..怎么写?
}
}
System.out.println();//行控制
System.out.print(combine.get(4) + " ");
//查看合并后的combine数组
System.out.print("新的combine数组2:");
for(int q=0;q<combine.size();q++){
System.out.print(combine.get(q) + " ");
}
System.out.println();//行控制
combine2.removeAll(combine);
//查看合并后的combine数组
System.out.print("新的combine2数组3:");
for(int q=0;q<combine2.size();q++){
System.out.print(combine2.get(q) + " ");
}
key.removeAll(key);
key.addAll(combine2);
//查看答案数据
System.out.print("答案数组key:");
for(int j=0;j<key.size();j++){
System.out.print(key.get(j) + " ");
}
}
}
晚上有努力想了下 感觉看到希望了 但是还是没有解决问题 --------------------编程问答-------------------- 用链表,打印的数从链表中移除,解决问题不会超过10行代码 --------------------编程问答-------------------- 这个就是约瑟夫环吧 --------------------编程问答-------------------- 上代码
static void printRing(int n, int k, int i) {--------------------编程问答-------------------- public class CircleCount {
List<Integer> numberList = new LinkedList<Integer>();
for (int iterN = 0; iterN < n; iterN++)
numberList.add(iterN + 1);
int count = i - 1;
while (numberList.size() > 0) {
Iterator<Integer> listIter = numberList.iterator();
while (listIter.hasNext()) {
count++;
Integer number = listIter.next();
if (count % k == 0) {
count = 0;
System.out.print(number + " ");
listIter.remove();
}
}
}
}
private int length;
private boolean[] arr;
public CircleCount(int n){
length=n;
arr=new boolean[length];
}
//初始化数组,使数组内每个元素都为flase
public void initialize(){
for(int i=0;i<arr.length;i++){
arr[i]=false;
}
}
public void removeQueue(int k,int i){
int flag=i;
int count=0;
int accumulate=0;
while(true){
//直到所有元素出列才结束
if(accumulate==length){
break;
}
if(!arr[flag]){
count++;
}
if(count==3){
count=0;
accumulate++;
arr[flag]=true;
System.out.println(flag+1+"号出现");
}
flag=(flag+1)%length;
}
}
public static void main(String[] args) {
CircleCount c=new CircleCount(20);
c.removeQueue(3,3);
}
}
补充:Java , Java SE