|
|
2005/3/13 上午 06:56:21
問題是這樣的 有關於畢式定理 一個直角三角形 兩邊長的平方和等於斜邊平方 提示是要用三重for迴圈 c*c == a*a + b*b 而for迴圈的地方要怎麼設: 我真的剛開始學… 太笨了 麻煩高手點一下
|
|
|
2005/3/14 上午 10:08:03
for (c=1; c<100; c++) { for (b=1; b<100; b++) { for (a=1; a<100; a++) { if (c*c == b*b + a*a) { printf ("%d^2 = %d^2 + %d^2", c, b, a) } } } }
預設最大值到 99
|
|
|
|
2005/3/15 上午 06:30:09
我是初學著..學ㄉ不是很好=.= 可以再寫清楚一點嗎? 這幾步我都有想到.... 只是寫到一半就停住ㄌ... 幫忙一下唷 感激伊!
|
|
|
|
2005/3/15 上午 07:29:32
這是我後面跟我朋友一起想的
#include <iostream>
using std::cout; using std::cin; using std::endl;
int main() { int a; int b; int c; for ( a = 1; a <= 500; a++ ) for ( b = 1; b <= 500; b++ ) for ( c = 1; c <= 500 - a - b ; c++ ) if ( c*c == a*a + b*b ) cout << "\n" << a << " " << b << " " << c;
return 0; }
跟二樓的朋友大部份相同 不過我用的是基本中的基本… 他用的有些我還是看不懂…??? 看來我還要多多學習
|
|
|
|
2005/3/15 上午 07:29:46
這是我後面跟我朋友一起想的
#include <iostream>
using std::cout; using std::cin; using std::endl;
int main() { int a; int b; int c; for ( a = 1; a <= 500; a++ ) for ( b = 1; b <= 500; b++ ) for ( c = 1; c <= 500 - a - b ; c++ ) if ( c*c == a*a + b*b ) cout << "\n" << a << " " << b << " " << c;
return 0; }
跟二樓的朋友大部份相同 不過我用的是基本中的基本… 他用的有些我還是看不懂…??? 看來我還要多多學習
|
|
|
|
2005/3/15 上午 09:07:56
只是顯示的方式不一樣而已,因為以前沒有 iostram,所以習慣都用 printf 另外不管是 for 還是 if,最好都用 { } 會比較有可讀性,也不容易錯
|
|
|
|
2005/3/15 下午 12:51:16
曾經見過一些很巧妙的方法, 自動生成, 很快, 不用測試的.
|
|
|
2005/3/15 下午 04:44:12
唔...你的程式有點小bug喔... 照你的跑法的話你求出來的解,c最大的範圍不過就是到226而已(因為到500共有772組解) 並不能正確的求到斜邊為5~500的情況..我想你這麼寫應該是想求 出至500的所有解...如果我猜錯的話..那a迴圈跟b迴圈也太浪費次數了 直角三角形的另外兩邊長沒有任何一方是可能超過斜邊的長度的... 所以用來當作另外兩邊長的a及b就沒有必要判斷到比c大的情況了..不是嗎? 不好意思,希望我的淺見能夠對你有幫助^^
如果需要快一點的解法的話...那就不要使用三個迴圈了..以別的演算思考邏輯來說.. 用面下的解法的話..以第一組解來說3 4 5..這個解法不過判斷了4次... 求斜邊為97的解時...也不過使用了177次的比較 以整體的速度來說...以求到500範圍的解來說,前述的方法(只求出到範圍226的那個) 共使用了 20708500次比較 此法能夠求到500共用了 238437次比較 如果數字更大那差距將會更大... 不知道我這麼寫有沒有bug..有的話也請不吝指正@@ 至於不用判斷的解法...我似乎也有看過的樣子= =...只是沒印象 是在哪裡看到那個程式碼的...那種程式的執行速率一定非常的快
#include<stdio.h> void main(){ int i,j,k;
for(i=5;i<=500;i++){ j=1; k=i-1; while(j*j<i*i && k>0){ if(j*j+k*k==i*i){ printf("%d %d %d\n",j,k,i); j++; k--; }else if(j*j+k*k>i*i){ k--; }else{ j++; } } } }
|
|
|
|
2005/3/15 下午 05:49:52
嗯嗯 我寫的的確有bug 哈哈 不過我是比較懶而已啦 a跟b我只是懶而已 就全部用500 因為我們老師出的就是要我們用for迴圈暴力破解法 而且一定要用三層for迴圈 而且是三個加起來不超過500 所以 我前面沒說清楚 sorry
|
|
|
|
2005/3/15 下午 05:51:08
收到 這個小地方沒注意到 下次會注意的 的確有括號會比較清楚
|
|
|
|
2005/3/16 上午 08:49:15
我再問一ㄍ問題唷... 如果我們把 (5, 4, 3) 和 (10, 8, 6) 視為同一組的話 那該怎麼改呢?
|
|
|
2005/3/16 上午 10:01:39
>另外不管是 for 還是 if,最好都用 { } 會比較有可讀性,也不容易錯 我覺得for或是if後面如如只有一個指令的話,那還是不要加{}比較好,如果要可讀性的話,其實縮排就夠了,而如果怕出錯的話,一行放一個指令就好了,多加{}有時反而會降低可讀性。
|
|
|
|
2005/3/16 上午 10:11:51
我覺得for或是if後面即使只有一個指令的話,還是要加{}比較好, for () { ... } 因為大多數情況下程式都會被改動, 改動後, 常常發生忘了加 {} 而引來不必要的bug.
|
|
|
2005/3/17 上午 11:21:43
把之前找到的 (5, 4, 3) 存起來,後面找到的 (10, 8, 6) 則計算斜率,若相等則刪掉,否則繼續加起來以供後續比對
假設 (a1, b1, c1) 的斜率為 b1/c1,則 (a2, b2, c2) 的斜率為 b2/c2,若要避免小數的誤差,可直接判斷 b1*c2 與 b2*c1 是否相等就可以了
|
|
|
|
2006/2/5 下午 06:18:51
a=2mn,y=m2-n2,z=m2+n2其中m,n(m>n)是互質且一奇一偶的任意正整數。
|
|
|
|
2006/2/10 上午 11:00:17
這樣寫應該可以加快些
略... int base[500];
count=0; for(i=0; i<500; i++) base[i] = 0;
for(a=1; a<500; a++) { for(i=0,flag=0; i<count; i++) { if(a%base[i] == 0) flag = 1; } if(flag == 1) continue;
for(b=a; b<500; b++) { for(c=c+1; c<500; c++) { if(c*c == a*a + b*b) { base[count++] = a; time=1; while(c*time < 500) { printf("%d,%d,%d\n", a*time, b*time, c*time); time++; } } } } }
|
|
|
|
2006/8/19 下午 02:49:30
我這裡有完整的範例 #include <iostream> #include <cmath>
using namespace std;
int main() { char chr[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; int a, chrlen = strlen(chr); cout << "請輸入密碼長度: "; cin >> a; cout.setf(ios::fixed); int (*b)[1] = new int[a][1]; for (int i=0;i<a;i++) b[i][0] = 0; for (int i=0;i<pow(chrlen,(float)a);i++) { for (int j=a-1;j>=0;j--) { if (b[j][0]>=chrlen && j>0) { b[j][0] = 0; b[j-1][0]++; } cout << chr[b[j][0]]; } cout << " "; b[a-1][0]++; } delete b; system("PAUSE"); return 0; }
|
|
|
|
2006/8/30 下午 02:50:51
>for (c=1; c<100; c++) >{ > for (b=1; b<100; b++) > { > for (a=1; a<100; a++) > { //多加一行可以讓for迴圈少跑一點, 程式效能比較好 if (c*c <= b*b + a*a and (b<c or a<c)) { > if (c*c == b*b + a*a) > { > printf ('%d^2 = %d^2 + %d^2', c, b, a) > } } > } > } >} > >預設最大值到 99
|
|
|
|
2006/8/30 下午 02:51:10
>for (c=1; c<100; c++) >{ > for (b=1; b<100; b++) > { > for (a=1; a<100; a++) > { //多加一行可以讓for迴圈少跑一點, 程式效能比較好 if (c*c <= b*b + a*a and (b<c or a<c)) { > if (c*c == b*b + a*a) > { > printf ('%d^2 = %d^2 + %d^2', c, b, a) > } } > } > } >} > >預設最大值到 99
|
|
|
|
2007/6/13 上午 12:12:30
那假如是算積數的呢?
|
|
|
|
2007/7/2 上午 03:46:52
#include<stdio.h> int main(){ int a,b,c,count=0,max,min,mid,key; int square[501]={0}; for(a=0;a<=500;a++){ square[a]=a*a; } for (a=1; a<=500; a++){ for (b=a+1; b<=500; b++){ max=(a+b<=500?a+b:500); min=b-a; key=square[a]+square[b]; mid=(int)(max+min)/2; while(square[mid]!=key && max>=min){ if(square[mid]>key) max=mid-1; else min=mid+1; mid=(int)(max+min)/2; } if(max>=min){ printf("(%d %d %d)",a,b,mid); count++; } } } printf("%d",count); getchar(); return 0; }
我用查表法和二分搜尋法寫的, 不知會不會比較快, 不過(a,b)和(b,a)我視為同一組, 而3,4,5和6,8,10視為不同組, 所以結果只有386組。
|
|
|
|
2007/7/2 上午 04:17:09
後來發現陣列好像有點多餘, 就把陣列改掉了。 #include<stdio.h> int main(){ int a,b,c,count=0,max,min,mid,key; for (a=1; a<=500; a++){ for (b=a+1; b<=500; b++){ max=(a+b<=500?a+b:500); min=b-a; key=a*a+b*b; mid=(int)(max+min)/2; while(mid*mid!=key && max>=min){ if(mid*mid>key) max=mid-1; else min=mid+1; mid=(int)(max+min)/2; } if(max>=min){ printf("(%d %d %d)",a,b,mid); count++; } } } printf("%d",count); getchar(); return 0; }
|
|
|
|
2007/7/2 上午 08:46:10
>我覺得for或是if後面即使只有一個指令的話,還是要加{}比較好, >for () { > ... >} >因為大多數情況下程式都會被改動, 改動後, 常常發生忘了加 {} 而引來不必要的bug. 如果是格式 A. for () { } 這種只有一行也要加括號較好, 因為眼睛要去找左括號不好對 (左括號可能在很後面)
但是如果格式 B. for () { } 這種只有一行時就不用加括號了, 因為從左邊一對就可以知道有沒有左括號.
|
|
|
|
2007/7/2 下午 04:24:58
>我再問一ㄍ問題唷... >如果我們把 (5, 4, 3) 和 (10, 8, 6) 視為同一組的話 >那該怎麼改呢?
那個只要仔細發現的話, (5,4,3)和(10,8,6)有個特點, 那就是(5,4,3)的最大公因數是1, 而(10,8,6)的最大公因數是2, 所以說只要把最大公因數是1的解顥示出來就可以了, 其它都可以算是同一組解。
#include<stdio.h>
int gcd(int a,int b){ if(a%b==0) return b; else return gcd(b,a%b); }
int main(){ int a,b,count=0,max,min,mid,key,sum=0; for (a=1; a<=500; a++){ for (b=a+1; b<=500; b++){ if(gcd(a,b)!=1) continue; max=(a+b<=500?a+b:500); min=b-a; key=a*a+b*b; mid=(int)(max+min)/2; while(mid*mid!=key && max>=min){ if(mid*mid>key) max=mid-1; else min=mid+1; mid=(int)(max+min)/2; } if(max>=min){ printf("(%d %d %d)%d\n",a,b,mid,500/mid); sum+=(int)500/mid; count++; } } } printf("%d %d",count,sum); getchar(); return 0; }
|
|
|
|
2011/3/9 下午 08:05:04
我写的程式是: #include<iostream> using namespace std; int fun(int a=0,int b=5) { return (a+b); } bool bad(int a,int b,int c) { return a+b<c; } int main() { for (int c=1; c<50; c++) { for (int b=1; b<100; b++) {
for (int a = b>c?(b+1):(c+1); a<100; a++) { if (bad(c,b,a)) break; if (a*a == b*b + c*c) { printf ("%d^2 = %d^2 + %d^2\n", a, c, b); } } } } }
|
|
|
|
2011/3/9 下午 08:05:18
我写的程式是: #include<iostream> using namespace std; int fun(int a=0,int b=5) { return (a+b); } bool bad(int a,int b,int c) { return a+b<c; } int main() { for (int c=1; c<50; c++) { for (int b=1; b<100; b++) {
for (int a = b>c?(b+1):(c+1); a<100; a++) { if (bad(c,b,a)) break; if (a*a == b*b + c*c) { printf ("%d^2 = %d^2 + %d^2\n", a, c, b); } } } } }
|
|
|
|
|
|
|
|
| C++ |
 |
|
| |
專家等級 |
評價 |
|
| |
一代宗師 |
10000 |
|
| |
曠世奇才 |
5000 |
|
| |
頂尖高手 |
3000 |
|
| |
卓越專家 |
1500 |
|
| |
優秀好手 |
750 |
|
|
|
|
|
|
|
|
|
|
|
|
Microsoft Internet Explorer
6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2013 程式設計俱樂部 http://www.programmer-club.com.tw/ |
|
|