導航:首頁 > 編程語言 > java循環演算法

java循環演算法

發布時間:2022-05-30 11:36:01

java約瑟夫經典循環演算法

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

閱讀全文

與java循環演算法相關的資料

熱點內容
加密媒體怎麼輸密碼 瀏覽:161
方舟如何刪除伺服器數據 瀏覽:600
用閱讀app怎麼看18 瀏覽:689
gn文件編譯 瀏覽:783
酷閃加密系統 瀏覽:820
區塊鏈數據加密 瀏覽:389
3d命令集 瀏覽:289
單片機的智能產品工廠里有 瀏覽:300
事業單位程序員有必要去嗎 瀏覽:583
人工智慧訓練小鳥python 瀏覽:132
怎樣把兩個pdf合並成一個 瀏覽:681
什麼app帶仿製圖章 瀏覽:420
單片機CJNE什麼意思 瀏覽:569
廊坊伺服器是什麼 瀏覽:763
客戶解壓要打欠條還是收據 瀏覽:774
通過app組件啟動有什麼壞處 瀏覽:775
不屬於國產密碼演算法 瀏覽:861
單片機LED顯示字型檔 瀏覽:353
日本文件夾品牌十大名牌 瀏覽:397
靜脈壓縮襪和打底褲的區別 瀏覽:345