討論區快速選單
知識庫快速選單
最新Microsoft免費研討會行事曆 .NET開發人員必修的資安課程 程式設計俱樂部Facebook粉絲團
[ 回上頁 ] [ 討論區發言規則 ]
關於for迴圈暴力破解法
更改我的閱讀文章字型大小
作者 : sa102221(Josh)
[ 貼文 19 | 人氣 8595 | 評價 0 | 評價/貼文 0 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/13 上午 06:56:21
問題是這樣的
有關於畢式定理
一個直角三角形
兩邊長的平方和等於斜邊平方
提示是要用三重for迴圈
c*c == a*a + b*b
而for迴圈的地方要怎麼設:
我真的剛開始學…
太笨了
麻煩高手點一下
作者 : johnny6740(牧童哥) VC++優秀好手驅動程式優秀好手Assembly優秀好手貼文超過500則人氣指數超過10000點
[ 貼文 791 | 人氣 24021 | 評價 3770 | 評價/貼文 4.77 | 送出評價 31 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人sa102221註記此篇回應為很有道理 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
作者 : kico709(小兔)
[ 貼文 2 | 人氣 1 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/15 上午 06:30:09
我是初學著..學ㄉ不是很好=.=
可以再寫清楚一點嗎?
這幾步我都有想到....
只是寫到一半就停住ㄌ...
幫忙一下唷
感激伊!
作者 : sa102221(Josh)
[ 貼文 19 | 人氣 8595 | 評價 0 | 評價/貼文 0 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
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;
    }

跟二樓的朋友大部份相同
不過我用的是基本中的基本…
他用的有些我還是看不懂…???
看來我還要多多學習
作者 : sa102221(Josh)
[ 貼文 19 | 人氣 8595 | 評價 0 | 評價/貼文 0 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
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;
    }

跟二樓的朋友大部份相同
不過我用的是基本中的基本…
他用的有些我還是看不懂…???
看來我還要多多學習
作者 : johnny6740(牧童哥) VC++優秀好手驅動程式優秀好手Assembly優秀好手貼文超過500則人氣指數超過10000點
[ 貼文 791 | 人氣 24021 | 評價 3770 | 評價/貼文 4.77 | 送出評價 31 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/15 上午 09:07:56
只是顯示的方式不一樣而已,因為以前沒有 iostram,所以習慣都用 printf
另外不管是 for 還是 if,最好都用 { } 會比較有可讀性,也不容易錯
作者 : kwong(kwong) 貼文超過200則
[ 貼文 257 | 人氣 739 | 評價 260 | 評價/貼文 1.01 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/15 下午 12:51:16
曾經見過一些很巧妙的方法, 自動生成, 很快, 不用測試的.
作者 : promiseway(promiseway)
[ 貼文 123 | 人氣 3991 | 評價 30 | 評價/貼文 0.24 | 送出評價 8 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人sa102221註記此篇回應為很有道理 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++;
}
}
}
}
作者 : sa102221(Josh)
[ 貼文 19 | 人氣 8595 | 評價 0 | 評價/貼文 0 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/15 下午 05:49:52
嗯嗯
我寫的的確有bug
哈哈
不過我是比較懶而已啦
a跟b我只是懶而已 就全部用500
因為我們老師出的就是要我們用for迴圈暴力破解法
而且一定要用三層for迴圈
而且是三個加起來不超過500
所以 我前面沒說清楚 sorry
作者 : sa102221(Josh)
[ 貼文 19 | 人氣 8595 | 評價 0 | 評價/貼文 0 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/15 下午 05:51:08
收到
這個小地方沒注意到
下次會注意的
的確有括號會比較清楚
作者 : kico709(小兔)
[ 貼文 2 | 人氣 1 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/16 上午 08:49:15
我再問一ㄍ問題唷...
如果我們把 (5, 4, 3) 和 (10, 8, 6) 視為同一組的話
那該怎麼改呢?
作者 : yannan(yannan)
[ 貼文 54 | 人氣 5 | 評價 130 | 評價/貼文 2.41 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人sa102221註記此篇回應為很有道理 2005/3/16 上午 10:01:39

>另外不管是 for 還是 if,最好都用 { } 會比較有可讀性,也不容易錯
我覺得for或是if後面如如只有一個指令的話,那還是不要加{}比較好,如果要可讀性的話,其實縮排就夠了,而如果怕出錯的話,一行放一個指令就好了,多加{}有時反而會降低可讀性。
作者 : kwong(kwong) 貼文超過200則
[ 貼文 257 | 人氣 739 | 評價 260 | 評價/貼文 1.01 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/16 上午 10:11:51
我覺得for或是if後面即使只有一個指令的話,還是要加{}比較好,
for () {
 ...
}
因為大多數情況下程式都會被改動, 改動後, 常常發生忘了加 {} 而引來不必要的bug.
作者 : johnny6740(牧童哥) VC++優秀好手驅動程式優秀好手Assembly優秀好手貼文超過500則人氣指數超過10000點
[ 貼文 791 | 人氣 24021 | 評價 3770 | 評價/貼文 4.77 | 送出評價 31 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人sa102221註記此篇回應為很有道理 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 是否相等就可以了
作者 : domos(domos)
[ 貼文 1 | 人氣 1 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/2/5 下午 06:18:51
a=2mn,y=m2-n2,z=m2+n2其中m,n(m>n)是互質且一奇一偶的任意正整數。
作者 : slchang(SL)
[ 貼文 117 | 人氣 8483 | 評價 540 | 評價/貼文 4.62 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
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++;
     }
     }
     }
   }
}
作者 : tim3721(湯圓仔)
[ 貼文 5 | 人氣 819 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
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;
}
作者 : olv8dboy(gww)
[ 貼文 17 | 人氣 140 | 評價 60 | 評價/貼文 3.53 | 送出評價 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
作者 : olv8dboy(gww)
[ 貼文 17 | 人氣 140 | 評價 60 | 評價/貼文 3.53 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
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
作者 : amy77806(邱)
[ 貼文 8 | 人氣 851 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/6/13 上午 12:12:30
那假如是算積數的呢?
作者 : yannan(yannan)
[ 貼文 54 | 人氣 5 | 評價 130 | 評價/貼文 2.41 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
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組。
作者 : yannan(yannan)
[ 貼文 54 | 人氣 5 | 評價 130 | 評價/貼文 2.41 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
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;
}
作者 : sailormoontw(Sailormoontw)
[ 貼文 118 | 人氣 3595 | 評價 430 | 評價/貼文 3.64 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/7/2 上午 08:46:10

>我覺得for或是if後面即使只有一個指令的話,還是要加{}比較好,
>for () {
> ...
>}
>因為大多數情況下程式都會被改動, 改動後, 常常發生忘了加 {} 而引來不必要的bug.
  如果是格式 A.
   for () {
   }
  這種只有一行也要加括號較好, 因為眼睛要去找左括號不好對 (左括號可能在很後面)

  但是如果格式 B.
  for ()
  {
  }
  這種只有一行時就不用加括號了, 因為從左邊一對就可以知道有沒有左括號.
作者 : yannan(yannan)
[ 貼文 54 | 人氣 5 | 評價 130 | 評價/貼文 2.41 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
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;
}
作者 : lpvoid(longlong)
[ 貼文 34 | 人氣 0 | 評價 30 | 評價/貼文 0.88 | 送出評價 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);
}
}
}
}
}
作者 : lpvoid(longlong)
[ 貼文 34 | 人氣 0 | 評價 30 | 評價/貼文 0.88 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
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);
}
}
}
}
}
 板主 : simula
 > C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
C++
1 Raymond 12600 
2 simula 4690 
3 青衫 4670 
4 coco 3900 
5 白老鼠(Gary) 3610 
6 Ben 2250 
7 ozzy 2010 
8 Anderson 1960 
9 windblown 1650 
10 Kenny 1540 
C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2014 程式設計俱樂部 http://www.programmer-club.com.tw/
0.21875