下面是我用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。具體怎麼回事,你找一個數組自己走一遍就能理解了,這樣印象也能更深刻