1樓:
min=(a[i]>a[i-1])?min:a[i];
如果a[i]>a[i - 1],始終比較的是當前元素和上一個元素,這是最根本的錯誤,比如 3 2 4 3
這條語句的執行過程就是,
min = 2
4>2 -> min = 2;
3<4 -> min = 3;
最終結果,min = 3;顯然是不對的。
正確的是要始終跟當前的min比較,而且不要刻意去追求語句簡短,條件運算子並不一定具有更高的效率。
min = (a[i] < min)?a[i]:min;//正確語句
同時,使用if(a[i] < min) min = a[i];也能做到一條語句解決問題。
另外,**還太過冗長,以及效率還太低下,僅僅只是找到最小值的話再輸入的時候就可以處理,這樣能節省o(n)的執行時間,在查詢時記錄i而不是min,這樣最終只要做一次交換就可以,程式始終控制在o(n),而且乘數因子控制在1,保證最高的效率。
核心部分的優化:(加個變數宣告int temp;)
while(scanf("%d",&n) != eof)
t = a[temp];
a[temp] = a[0];
a[0] = t;}
2樓:匿名使用者
for(i=0;i if(a[i]==min) j=i; t=a[0]; a[0]=min; a[j]=t; 這段**少了大括號把,應該是 for(i=0;i 還有這一段: for(i=0;i if(i!=n-1) printf("%d ",a[i]); else printf("%d\n",a[i]); 一樣的問題: for(i=0;i 3樓:匿名使用者 你的意思是用最小的數跟第一個數相交換吧?那你應該用min表示下標,這樣更簡單的。 #include #include #include void main() t=a[0]; a[0]=a[min]; a[min]=t; for(i=0;i if(i!=n-1) printf("%d ",a[i]); else printf("%d\n",a[i]); } } 4樓:匿名使用者 continue;改為break; 感覺好亂,每行選擇排序遍歷一次就可以了,同意goal000011··· 5樓:匿名使用者 min=a[0]; for(i=1;ia[i-1])?min:a[i]; } 有錯! 你比較的只是相鄰的兩個元素,而非尋找最小的元素。 另外,你的思路不夠清晰,**繁瑣冗長。 我寫了一個,僅供參考。 #include #include int main() if (min != 0) for(i=0;i printf("%d ",a[i]); printf("%d\n",a[n-1]); }system("pause"); return 0;} 6樓:匿名使用者 恩,樓上的幾位都已經指出錯誤了,就是那個min=(a[i]>a[i-1])?min:a[i]; 這句應該是min=(a[i]>min)?min:a[i]; 相信你能看的出來為什麼錯。 提醒下,從你的程式來看,還是有一定的基礎的,估計是粗心導致的錯誤。 問題是你的程式不具有可讀性,看起來很吃力,雖然像min=(a[i]>a[i-1])?min:a[i]; 這種語句好像比較能體現程式設計能力,但是可讀性很差,建議以後少用這種語句,語句儘量的簡單易懂較好。 大規模的程式設計中,可讀性是很重要的。 7樓:匿名使用者 while(scanf("%d",&n)!=eof) 中的eof是什麼啊 include include void main sum sum max min score sum n 2 printf 2f n score 太多了,看到就累! sum應在while迴圈中初始化,也就是說每次輸入前sum都必須清0 include include void main sum s... s 2 是一個指標陣列,指向兩個字串 s 0 s 1 while s 1 0 迴圈,條件為 s 1 0 字串的最後一個值是 0 這裡遍歷s 1 字串,一共會遍歷4次。 寒鐵礦 你定義了一個指標陣列,s 0 指向的是第一個 字串的起始地址,s 1 指向的是第二個 字串的起始地址。while s 1 0... while tt 0 在這裡不能直接用 tt 因為你用這個的話,它是判斷之後就加到下一個了,所以這樣的話,第一個字元你是不能判斷的,所以總會少一個啊 應該這樣 while tt 0 程式改寫成 include include void fun char tt,int pp main 我只是改動了你的...一道很簡單的C語言題
一道簡單的c語言題目,一道簡單的C語言題目
c語言的一道很簡單的題