下面是我用c#写的,其实原理都一样,楼主自己研究下吧
Console.WriteLine("请输入参与游戏的人数:");
int numPerson = int.Parse(Console.ReadLine());
Console.WriteLine("请输入游戏退出的规则数:");
int ruleNum = int.Parse(Console.ReadLine());
bool[] person = new bool[numPerson]; //定义每个人是否退出开关,默认为否
int callNum = 0; //报数
int total = 0; //记录已经退出的人数
int index = -1; //报数的循环游标
while (true) {
index++; //从第一个人开始
index %= numPerson; //确保数组不越界,当游标指向最后一个数组元素以后,从头开始
if (!person[index]) { //第index个人没有退出时,则进行报数
callNum++;
}
if (callNum == ruleNum) { //当第index个人报数的数字与规则数相同时,则开关打开,退出报数
person[index] = true;
total++; //退出的总人数更新
callNum = 0; //为下一个人报数更新数据
Console.WriteLine("玩家{0}退出",index+1);
}
if ((numPerson - total) == 1) { //当游戏玩家只剩下一个的时候结束游戏
for (int i = 0; i < person.Length; i++) {
if (person[i] == false) { // 判断退出开关依然是否的玩家
Console.WriteLine("最后剩下的玩家是第:{0}位",i + 1); //输出实际的玩家号
break;
}
}
break;
}
}
Ⅱ 求助,用Java写一个递归或者循环算法
packagecom.complaints;
importjava.util.ArrayList;
importjava.util.List;
importorg.junit.Test;
importcom.alibaba.fastjson.JSONArray;
publicclasstest{
privateList<MTS>org_list=newArrayList<MTS>();
privateList<MTS>final_list=newArrayList<MTS>();
publictest(){
MTSa=newMTS();
a.setId("1");
MTSb=newMTS();
b.setId("1.1");
MTSc=newMTS();
c.setId("1.1.1");
MTSd=newMTS();
d.setId("2");
MTSe=newMTS();
e.setId("2.1");
org_list.add(a);
org_list.add(b);
org_list.add(c);
org_list.add(d);
org_list.add(e);
}
@Test
publicvoidarrange(){
for(inti=0;i<org_list.size();i++){
Stringid=org_list.get(i).getId();
intcnt=id.split("\.").length;
Stringtar_string=id+".";
intchild_cnt=0;
for(intk=0;k<org_list.size();k++){
Stringchild_id=org_list.get(k).getId();
intz=child_id.indexOf(tar_string);
String[]aaa=child_id.split("\.");
inty=aaa.length-1;
if(z==0&&y==cnt){
this.addChild(org_list.get(i),org_list.get(k));
child_cnt++;
}
}
if(cnt==1&&child_cnt!=0){
final_list.add(org_list.get(i));
}
}
Stringjson=JSONArray.toJSONString(final_list);
System.out.println(json);
}
privatevoidaddChild(MTSparent,MTSchild){
List<MTS>childs=parent.getChildMTS();
if(childs==null){
childs=newArrayList<MTS>();
}
childs.add(child);
parent.setChildMTS(childs);
}
}
最后输出结果:[{"childMTS":[{"childMTS":[{"id":"1.1.1"}],"id":"1.1"}],"id":"1"},{"childMTS":[{"id":"2.1"}],"id":"2"}],应该是符合你需求的
Ⅲ JAVA代码如何循环计算定义的值
不断把值赋值给自己定义的变量就行了。
1、自定义一个变量
int self = 0;
2、通过for循环给self赋值for(int i=0;i<100;i++){ self = i;//for循环,从0到99,依次赋值给自定义变量self}
Ⅳ java中如何计算for循环的循环次数
如果是foreach,可以新建一个计数器。如果是for,使用i的就可以了。
1,foreach形式,代码如下:
List<String>list=newArrayList<String>();
intnum=0
for(Stringstring:list){
num=num+1;//每次循环加1.
}
System.out.println(num);
就可以得到循环次数。
2,for形式,代码如下
List<String>list=newArrayList<String>();
for(inti=0;i<list.size();i++){//list.size()就是循环的次数
}
System.out.println(list.size());
Ⅳ java十大算法
算法一:快速排序算法
快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。
快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。
算法步骤:
1 从数列中挑出一个元素,称为 "基准"(pivot),
2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
3 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
算法二:堆排序算法
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
堆排序的平均时间复杂度为Ο(nlogn) 。
算法步骤:
创建一个堆H[0..n-1]
把堆首(最大值)和堆尾互换
3. 把堆的尺寸缩小1,并调用shift_down(0),目的是把新的数组顶端数据调整到相应位置
4. 重复步骤2,直到堆的尺寸为1
算法三:归并排序
归并排序(Merge sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
算法步骤:
1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置
3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
4. 重复步骤3直到某一指针达到序列尾
5. 将另一序列剩下的所有元素
Ⅵ java(for循环)有没有更简单的算法,比如直接算出来质数,不写第二个for循环
不写第二个for循环是不可能的(目前人类的数学而言)!除非你是已经把结果存在一个数组里,那就相当于已知答案求答案,也没有意义了。或者是用一个子函数代替了第二个for循环,或者用while之类的,那是钻牛角尖,本质上还是循环
因为还没有研究出任何的连续质数的准确的递推关系式,(有质数分布规律的关系式,但不是100%准确的)
所以,只能假设这个数可能是质数,再来求证。
不过你的程序可以做下列改进,大大加快执行速度:
第二个for循环:
for (int j = 2; j < i; j++) {
j不需要遍历到i-1,只要遍历到 根号i的向下取整就够了。因为:如果一个数是合数,那么它的最小质因数肯定小于等于他的平方根。这样一来时间复杂度有O(n^2)降低到O(n^1.5)
而且j也一样,可以直接从3开始除,j+=2。因为你i都已经是奇数了,i/2还要判断吗?
所以第二个for循环可以改为:
//sqrt_i如果不提前算好,把sqrt函数搞进第二个for循环去遍历,计算量会非常的大!其实还可以自己用乘法试乘来代替此语句,因为i是单调递增的,sqrt_i也必然是。
intsqrt_i=(int)sqrt((double)i);
for(intj=3;j<sqrt_i;j+=2){
//...
事实上,j不需要等于所有奇数,只要等于所有质数就行了,但搞质数的程序比较麻烦,而且该程序规模不大,没有必要。
Ⅶ java用循环编写一个计数程序输入几个数字直到输入0为止,计算输入的这些数的平均数
参考代码如下:
import java.util.*;
public class Main
{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int sum = 0;
int count = 0;
while(true){
int num = sc.nextInt();
if(num == 0) break;
sum += num;
count++;
}
System.out.println("平均值:"+sum*1.0/count);
}
}
运行结果:
Ⅷ java排序算法for循环语句怎么理解请帮忙讲解下,
class Sortint_1 {
int i,j,k,temp;
void Sortint(int a1,inta2[]) { //传递参数 数组长度,数组对象{1,5,2,0}
for(i=0;i<a1-1;i++) { //从第一个元素开始遍历数组
k = i; //k和i同步
for(j=i+1;j<a1;j++) // j定位为第二个元素,开始内循环找到未排序中最小值
if(a2[j]<a2[k]) k=j; //如果在未排序中的元素有比当前K值小的,则将k置为较小元素的下标,始终保持k最小
if(k!=i) {
temp = a2[i];a2[i]=a2[k];a2[k]=temp; //遇到小值则i,k交换
}
}
}
总结:内层循环是为了寻找未排序中的元素的最小值;找到后在外层循环将值赋给i。具体怎么回事,你找一个数组自己走一遍就能理解了,这样印象也能更深刻