A. 有關演算法的問題
您好,您問答這個問題很好,很有意義。
您的這個問題與電腦的計算過程有關,和編程語言也有關。A與C,是兩個大數,B相對來說就很小。按您的計算結果,情況應該是這樣:編程語言編譯時是從左到右對計算進行編譯(部分編譯器會反方向進行),此時,A和C會被識別為浮點型,B識別為整型(不知道您是什麼編譯器,什麼語言,這里假設是弱類型的語言),那麼運算時,A先與B運算,就是一個浮點型與一個整型運算,自動類型轉換會轉換C為浮點型(在運算中,較低「等級」的類型與較高「等級」的類型運算時,會自動類型轉換),此時相當於一個大數與一個接近0的數相加,根據IEEE標准,浮點數是由符號位S、階碼E和尾數M組成,其中能夠決定精度的尾數M在單精度浮點數裡面,僅有23位,那麼在A與B相加後,可以「認為」A+B=A,因為這個「小數」1,在產生的結果中「不存在」,因為這個A的尾數的最低一位表示的值都比1大。
這樣,A+B+C就是0,而先算浮點數的演算法卻不同,因為A+C算完了,其結果大約是絕對值小於1e-6的一個數(也就是說,對於浮點數,不存在真正意義上的0的說法,浮點數裡面,認為小於1e-6的數,就是0),此時在與1相加,提升為浮點型後,這個小於1e-6的尾數在新的浮點數裡面也就「不存在」了,與上邊所說的A+B「相當於」沒加是一個道理。
您問的這個問題,是編程與科學計算中一個基本問題,就是計算方法裡面的精度問題。在用計算機處理數據時,此類問題處理不好,會對計算結果產生關鍵影響。更詳細的細節建議網路相關內容進行學習。
參考:http://ke..com/link?url=-eAbFbjw_t_HG9vjrxEN5q
B. 有關演算法問題
分治法的基本思想是將一個規模為n的問題分解為k個規模較小的子問題,這些子問題相互獨立且與原問題相同。遞歸的解這些子問題,然後將個子問題的解合並得到原問題的解。
分治法的基本步驟:
divide-and-conquer(P)
{
if ( | P | <= n0) adhoc(P); //解決小規模的問題
divide P into smaller subinstances P1,P2,...,Pk;//分解問題
for (i=1,i<=k,i++)
yi=divide-and-conquer(Pi); //遞歸的解各子問題
return merge(y1,...,yk); //將各子問題的解合並為原問題的解
}
#include <stdio.h>
//--------------------------------------------------------
// 列印搬運動作
//--------------------------------------------------------
int MoveIt(int x,int Source,int Target)
{
printf("Move %d From %d to %d\n",x,Source,Target);
return 0;
}
//--------------------------------------------------------
// 用 4 根柱子移動盤子
// n 是盤子個數,編號從1 到 n
// First 是源柱子號
// Second Third 是兩根過渡柱
// Fourth 是目標柱
//--------------------------------------------------------
int MoveHanoi(int n,int First,int Second,int Third,int Fourth)
{
if (n<1) return 0; // 如果沒有盤子就返回
if (n==1) // 如果只有一個盤子
{
MoveIt(n,First,Fourth); // 就直接從源柱子移到目標柱子上
return 0;
}
if (n==2) // 如果有兩個盤子
{
MoveIt(n-1,First,Second); // 把上面的那片移到一個過渡柱上
MoveIt(n,First,Fourth); // 把下面的那片移到目標柱上
MoveIt(n-1,Second,Fourth); // 再把第 1 片從過渡柱移到目標柱上
return 0;
}
if (n==3) // 如果有 3 片盤子
{
MoveIt(n-2,First,Second); // 把最小的盤子移到一個過渡柱上
MoveIt(n-1,First,Third); // 把中間盤子移到另一過渡柱上
MoveIt(n,First,Fourth); // 把最大的盤子移到目標柱上
MoveIt(n-1,Third,Fourth); // 把中間盤子移到目標柱上
MoveIt(n-2,Second,Fourth); // 把最小的盤子移到目標柱上
return 0;
}
// 遞歸地把上面 n-2 盤子移到一個過渡柱上
// 留下最大的兩個盤子
MoveHanoi(n-2,First,Third,Fourth,Second);
MoveIt(n-1,First,Third); // 把倒數第 2 個盤子移到另一個過渡柱上
MoveIt(n,First,Fourth); // 把最底下的盤子移到目標柱上
MoveIt(n-1,Third,Fourth); // 把倒數第 2 個盤子移到目標柱上
// 遞歸地把 n-2 個盤子從過渡柱上移到目標柱上
MoveHanoi(n-2,Second,First,Third,Fourth);
return 0;
}
int main()
{
MoveHanoi(4,1,2,3,4);
return 0;
}
C. hannoi演算法問題
可以用遞歸的方式。
假設有3跟柱子A,B,C,需要把A柱子上的n個盤子全部搬到C柱子上。
分三步走:1.把n-1個盤子搬到B柱子上,2.把第n個盤子搬到C柱子上,3.把B柱子上的n-1個盤子搬到C柱子上。
函數可以這樣:
void Hannoi(int n,char A,char B,char C)
{
if(n==1)
Move(1,A,C);
else
{
Hannoi(n-1,A,C,B);
Move(n,A,C);
Hannoi(n-1,B,A,C);
}
}
D. 演算法的問題
著不是很簡單的一段C語言嘛,循環三次,每次循環過程中,要求出入一個字元,循環完成後,然後退出運行。。。。
你追問哪個是輸出輸入輸出字元串的,那個#include<math.h>沒必要包含,你知道這些庫文件的作用嗎??
E. 求助演算法問題
留個腳印..
沒看清題..-.-不用截...
先對S排序
對於S的元素a0,a1,a2...an進行查詢
取x=a0,y=an,
如果x+y>z,y=a(n-1),
如果x+y<z,x=a1.
即從兩邊向中間查詢
如此直到兩數和為z(結果),或者讀取的兩個數相等(無結果).
F. 計算機演算法問題
這個最短平均排隊時常其實就是要求大家等待的時間越短越好。從題目上看好像只有一個人來服務這n個人,所以如果希望大家等待的時間短的話,就應該將服務時間最長的人拍在最後,然後將服務時長第二長的排在倒數第二位...
如果要做演算法就可以將服務時長作為權重,權重越大就排隊越靠後。
G. C語言演算法問題
這不是所有演算法都必須的,是它這種演算法的邏輯需要——當n是素數時一旦i*i>=n,就到i<n的判斷處了,由於i<n,所以認為n是素數並輸出,進入n+1判斷下一個數是不是素數;但如果n不是素數,那麼前面設置了一個i=n作記號,這時返回去i*i>=n了,也要跳到i<n的判斷處,但這時由於i==n而不認為n是素數就不輸出且直接進入n+1判斷下一個數……所以你完全可以設計一個演算法不要i<n的判斷。這里只是為了與前面檢測出n不是素數後設置的i=n這個記號相呼應的邏輯需要!
H. 一個演算法問題
整個程序其實就是個求和
可以改寫為
s=0;
for(l=1;l<=100;l++){
s=s+l^2;
}
system.out.println(s);
整個程序其實是求 1^2 +2^2 +3^2 +...+100^2 ,即 1 到 100 的平方和
I. 關於計算機演算法問題
是這樣 把思路轉化為演算法 然後化為程序語言(有各種的程序語言) 然後用特定的編譯器執行語言 最後就是你看到的了