我使用Borland C++ Builder
要寫一個程式如下:
使用者輸入一個4位數的數字為M
M=(q-1)*(p-1)
而q和p都必須為質數 M必定為偶數
但是答案有誤 請各位高手幫忙修正
我會非常感謝的!
這不算是我的作業~
是我研究演算法中的一個片段
所以希望如有老師級的 也一起給個意見喔
謝謝
我目前寫的程式如下:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i=0, k;
String strTmp;
/* 用陣列儲存 100 以內的質數 (共25個) */
int prime_arr[] = {2, 3, 5, 7, 11, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97};
m=StrToInt(this->Edit1->Text);
for (int i = 0; i < 24; i++)
{
j = prime_arr[i] - 1;
if (m % j == 0) /* 整除 */
{
n = m/j + 1; /* 另一質數 */
for (k = 1; k <= 25; i++)
{
if (n = prime_arr[k]) break; /* 找到了 */
}
}
}
//印出 (j+1) 和 n
strTmp.printf("%d", j+1);
this->Edit2->Text = strTmp;
strTmp.printf("%d", n);
this->Edit3->Text = strTmp;
}
2006-12-18 14:04:16 · 2 個解答 · 發問者 KEIGO 1 in 電腦與網際網路 ➔ 程式設計
問題可能在 j = prime_arr[i] - 1;
2006-12-18 15:26:21 · update #1
對不起
上次我祇有寫重點
所有細節沒有真正去執行或偵錯
這次我自己執行過 沒問題了
你的陣列少了 13.
for (i = 0; i < 25; i++) /* <25 或 <= 24 */
{
j = prime_arr[i] - 1;
if (m % j == 0) /* 整除 */
{
n = m/j + 1; /* 另一質數 */
for (k = 0; k < 25; k++) /* 同 i, k++ 上次誤打 i ++ */
{
if (n == prime_arr[k]) break; /* 找到了 */
}
}
if (k < 25) break; /* 前一個 break 祇跳出 k 迴路 */
}
if (i < 25) /* 如果加上這條件, 則可測試任何數 */
{
printf("%d\n", j+1);
printf("%d\n", n);
}
else
printf("無解.\n");
return 0;
}
2006-12-21 01:25:26 · answer #1 · answered by JJ 7 · 0⤊ 0⤋
1.你的質數陣列不滿25,漏了一個13
2.大小為25的陣列只能使用0,1,2,3,...,24,你有使用到第25個位置是錯誤的用法。
3.if (n = prime_arr[k]) break; /* 找到了 */
上面那行是錯誤的用法 他會令 n 為 prime_arr[k],請更正。
其他邏輯的錯誤我想要自己找比較有感覺。
另外補充一點 break只能跳出一層迴圈,而不是跳出所有迴圈。
2006-12-20 08:59:03 · answer #2 · answered by ? 4 · 0⤊ 0⤋