找回密碼
 註冊

C++ 兩個大數(array型態)比大小

来源: 新聞 gimball1220 2010-10-22 12:44 只看這個作者 |閱讀模式
9 8748
// while i is less than or equal to high
while( less( i, high ) || equal( i, high ) )
{
if( isPrime( i ) ) // if i is prime
output( i ); // output i to the file
increment( i ); // increment i by 1
}
return 0;
}
bool isPrime( int i[] )
{
int j[100] = { 0 };
j[0] = 2; // set the value j to 2
while( less( j, i ) ) // while j is less than i
{
if( divides( j, i ) ) // if j divides i
return false;
increment( j ); // increment j by 1
}
return true;
}
----------------------------------------------放在兩個array的數如何比大小? increment( i )...類似i++的,想法是先把i[]反轉過來(假設輸入是12345 轉成54321,因為位子的關係) 用for檢查如果i[p] > 9 則i[p] = i[p] % 10 和 i[p+1]++ 只是感覺這樣很麻煩,有比較好的方法嗎?
[ 本文章最後由 gimball1220 於 2010-10-23 01:09 編輯 ]
本文最後由 kimiyoko 於 2017-9-28 16:51 編輯

收藏
收藏0
原 來 " 平 淡 " 也 可 以 這 麼 美 好 ! !

網友回覆9

跳到指定樓層
2#
小保007 2010-10-22 13:03 只看這個作者
是否能解釋得清楚一點?

本文最後由 kimiyoko 於 2017-9-28 16:51 編輯

問題更改在一樓
[ 本文章最後由 gimball1220 於 2010-10-23 01:10 編輯 ]

本文最後由 kimiyoko 於 2017-9-28 16:51 編輯

原 來 " 平 淡 " 也 可 以 這 麼 美 好 ! !
問題改在1樓
[ 本文章最後由 gimball1220 於 2010-10-23 01:09 編輯 ]

本文最後由 kimiyoko 於 2017-9-28 16:52 編輯

原 來 " 平 淡 " 也 可 以 這 麼 美 好 ! !
5#
小保007 2010-10-24 18:49 只看這個作者
再麻煩也是電腦再跑吧....C++ 兩個大數(array型態)比大小6215
話說 題目的原文怎麼不見了C++ 兩個大數(array型態)比大小7135
正想要開始動工的

本文最後由 kimiyoko 於 2017-9-28 16:52 編輯

回覆 5# 小保007 的文章

呵呵,你想要原文阿@@"~
Write a program that reads in two very large positive integers low and high, then prints all prime numbers between low and high into a file. Please implement the functions input, copy, less, equal, increment, divides in the following program template.
int main()
{
        int low[100];
        int high[100];
        input( low ); // input two strings that represent two positive integers,
        input( high ); // and put them into low and high, respectively.
        int counter[100] = {0};
        int i[100] = {0};
        copy( low, i ); // copy the value of low into i
        // while i is less than or equal to high
        while( less( i, high ) || equal( i, high ) )
        {
                if( isPrime( i ) ) // if i is prime
                        output( i ); // output i to the file
                increment( i ); // increment i by 1
        }
        return 0;
}
bool isPrime( int i[] )
{
        int j[100] = { 0 };
        j[0] = 2; // set the value j to 2
        while( less( j, i ) ) // while j is less than i
        {
                if( divides( j, i ) ) // if j divides i
                        return false;
                increment( j ); // increment j by 1
        }
        return true;
}

本文最後由 kimiyoko 於 2017-9-28 16:52 編輯

原 來 " 平 淡 " 也 可 以 這 麼 美 好 ! !
我剛剛上網找Prime是指質數的意思對吧?
我也找到這個網址
我在我們資管系論壇發表的找質數
找質數的方法很簡單,第一個方法是最笨的全部跑一遍,第二個方法是懂得簡單數學的人跑一半,第三種是幾乎趨近於高手級的跑1/3
但問題都是怎麼找質數?當時我主要是跟老師討論演算法的問題
如果你說的Prime是指質數,那我可以提供上面三個版本給你參考。
不過我看得出來這題主要是叫你們要實做function比較為重點
外國的題目我覺得有時候極端過頭了!要寫出累加、等於的功能是不難只是return一個值回去,但這些符號 + - * / = 程是很常用到的東西沒必要寫成function。
再來就是他說要input很大的數值,講真的這就是演算法的問題,基本上大學有教到大概在大2~3之間,資工系。
如果只是大一的基本程式設計課程來說,有點難。
因為是不是質數,這個程式說真的你跑我的程式三種都給他跑一次,你會發現第三種找質數,你打上999999999(9個九),第一個方法會跑到程是快當掉,第二個普通,第三個一下就全部解完答案了,相信這題說要輸入很大很大的正整數來找質數應該是部分再考演算法問題。
影片第一個方法全部跑一遍 1~200000找質數 大約17秒找完

第二個方法1~200000大約13秒找完

第三個方法10秒內找完

程式碼
#include <iostream>
#include <math.h>
using namespace std;
void main(){
  /* int number;
   int sum=0;
   int counter = 0;
   cin >> number;
   for(int i = 1;i <= number ;i++){
      if ( number % i == 0 )
      {
         counter++;
         cout << i << "  counter:" << counter << endl;
         sum=sum + i;   
      }
        
   }
   cout << "sum=" << sum;
   cin >> number; */
        int upper;
        int lower;
        bool Prime_Number=true;
        int counter=0;
        cout << "Enter lower:";
        cin >> lower;
        cout << "Enter upper:";
        cin >> upper;
       
        if (lower == 1) lower =2;
        for(int i=lower;i<=upper;i++){
               
                //三種方法在這
               
                //for(int j=2;j<=i-1;j++){ //第一種全部跑一片
                //for(int j=2;j<=i/2-1;j++){ // 改成j<=i/2-1
                for(int j=2;j<=int(sqrt(double(i)));j++){ // Sqrt(i);
               
                //三個for迴圈前面的//三個只能一次拿掉一個
                        counter++;
                        if (i % j == 0) {
                                Prime_Number=false;
                                j=upper; // Break j,Next i;
                        }
                       
                }
                if (Prime_Number) cout << i << "   ";
                Prime_Number=true;
        }
        cout << endl;
        cout << "J內共跑了" << counter << "次";
        cin >> lower;
}

[ 本文章最後由 hollowaysxp 於 2010-10-24 20:48 編輯 ]

本文最後由 kimiyoko 於 2017-9-28 16:52 編輯

呵呵,您看一下我的程式碼可能會比較知道我的問題出在哪~
#include<iostream>
#include<iomanip>
#include<cstring>
#include<fstream>
void copy( int [] , int [] , int []) ;
void input (int [] ) ;
bool less ( int [] , int [] ) ;
bool equal( int [] , int []) ;
bool isPrime( int [] , int [] ) ;
bool divides( int [] , int [] , int [] ) ;
void increment( int [] ) ;
void increment2( int [] ) ;
void output( int [] ) ;
bool zero( int [] ) ;
using namespace std ;
int main ()
{
        int low[100] = {0} ;
        int high[100] = {0} ;
    int counter[100] = {0} ;
        int i[100] = {0} ;
        int w[100] = {0} ;
   // ofstream outfile ("answer.txt" , ios:C++ 兩個大數(array型態)比大小9991ut) ; // 創立一個檔案(file)
       
    input ( low ) ;
        input ( high ) ;
        copy( low , i , w); // copy the value of low into i
        while( less( i, high ) || equal( i, high ) )
             {
                        if( isPrime( i , w ) ) // if i is prime
                                output( i ); // output i to the file
                        increment( i ); // increment i by 1
             }
system("pause") ;
return 0 ;
}
void input (int input [])
{
        char a[100] ;
        int c = 0 , place ;
        cin >> a ;
        int count1 = strlen(a) ; // count1 為初始low的位數
        for(int i = 0 ; i <= count1-1 ; i++) // 將char[]印至int[]
                        input = a - '0' ;
                       
        for(int p = count1-1 ; p >= count1/2 ; p--) // 反轉印
           {
                 place = input[p] ;
                 input[p] = input[c] ;
                 input[c] = place ;
                 c++ ;
           }       
}
void copy( int low[] , int i[] , int w[]) // i 為 count1 位數   
{
        int count1 = 0 ; // low 的次數
       
        for(int p = 99 ; p >= 0 ; p--)
                  if( low[p] != 0 )
                    {
                          count1 = p+1 ; // 倒回來找,遇到不是0的數的話,位數為p+1
                          break ;
                    }
        for(int p = 0 ; p <= count1-1 ; p++)
                     i[p] = low[p] ;       
       
        for(int p = 0 ; p <= 99 ; p++) // 為了避免改掉i [] 內的值,所以用 w []做計算
                 w[p] = i[p] ;
}
bool less (int current[] , int compare [])
{
        int current_length = 0 ; // i的位數
        int compare_length = 0 ; // high位數
        for(int p = 99 ; p >= 0 ; p--)
                 if(current[p] != 0)
                   {
                         current_length = p+1 ;
                  break ;
                   }
        for(int p = 99 ; p >= 0 ; p--)
                 if(compare[p] != 0)
                   {
                         compare_length = p+1 ;
                  break ;
                   }
               
                 if( current_length < compare_length )
                          return true ;
               
                 if( current_length > compare_length )
                          return false ; //位數不小於或等於,就為大於,此時return false
                for(int p = current_length ; p >= 0 ; p--) // 位數相等時
                        {
                                if(current[p] < compare[p]) // 從最高位開始比較,i[]是否小於high[] ,忽略 == 的狀況
                                        return true ;
                                if(current[p] > compare[p]) // 從最高位開始比較,i[]是否大於high[] ,忽略 == 的狀況
                                        return false ;                           
                        }
               
                return false ; //  因為忽略相等,所以當for條件跑完,< 和 > 條件皆不成立的情況下,兩數必為相等 ,所以return false
                                   
}
bool equal (int i[] , int high[])
{
    int i_length = 0 ; // i的位數
        int high_length = 0 ; // high位數
        for(int p = 99 ; p >= 0 ; p--)
                 if(i[p] != 0)
                   {
                         i_length = p+1 ;
                  break ;
                   }
        for(int p = 99 ; p >= 0 ; p--)
                 if(high[p] != 0)
                   {
                         high_length = p+1 ;
                  break ;
                   }
       
        if( i_length < high_length )
                        return false ;
               
        if( i_length > high_length )
                        return false ;
                                 
        for(int p = i_length ; p >= 0 ; p--)
                {
                  if(i[p] < high[p]) // 從最高位開始比較,i[] 是否小於high[] ,忽略 == 的狀況
                         return false ;
                  if(i[p] > high[p]) // 從最高位開始比較,i[] 是否大於high[] ,忽略 == 的狀況
                         return false ;                           
                }
       
        return true ; //  因為忽略相等,所以當for條件跑完,< 和 > 條件皆不成立的情況下,兩數必為相等 ,所以return true                                   
               
}
bool isPrime( int i[] , int w[] )
{
        int j[100] = {0};
            j[0] = 2 ; // set the value j to 2
       
        while( less( j , i ) ) // while j is less than i
             {         
                         if( divides( j , i , w) ) // if j divides i        
                                 return false;
                         increment2( j ) ; // increment j by 1
                
             }
        return true ;
}
bool divides(int j[] , int i[] , int w[])
{
        while(less ( j , w ))
             {
                    for(int p = 0 ; p <= 99 ; p++)
                       {
                                 w[p] = w[p] - j[p] ;
                                 if( w[p] < 0 )
                                     {
                                      w[p+1]-- ;
                                      w[p]+=10 ;
                                     }
                            }       
            
                        if( zero (w) ) // 檢查 w[] 是否每個位子都等於0,如果是...則非質數
                         return true ;
            }
        return false ;
}
void increment( int  increment[] )
{       
        increment[0]++; // 個位數+1
       
        for(int p = 0 ; p <= 98 ; p++) // 從第一位跑道倒數第二位,如j[p]超過9,則-10。且j[p+1]加1
           {
                if(increment[p] > 9)
                  {
                   increment[p] -= 10 ;
                   increment[p+1]++ ;
                  }
           }
}
void increment2( int  j[] )
{       
        j[0]++; // 個位數+1
       
        for(int p = 0 ; p <= 98 ; p++) // 從第一位跑道倒數第二位,如j[p]超過9,則-10。且j[p+1]加1
           {
                if(j[p] > 9)
                  {
                   j[p] -= 10 ;
                   j[p+1]++ ;
                  }
           }
}
void output( int i [] )
{
        int count ; //質數的位數
       
        for(int p = 99 ; p >=0 ; p--)
                if( i[p] != 0)
                  {
                        count = p+1 ;
                        break ;
                  }
               
        for(int p = count-1 ; p >= 0; p--)
                 cout << i [p] << ' ' ;
        cout <<endl ;
}
bool zero( int w[] )
{
        for(int p = 0 ; p <= 99 ; p++) // 檢查 w[] 是否有數字不等於0,如果有就可能不是質數
           {
                if( w[p] != 0)
                   {
                         return false ;
                         break ;
                            }
              }
        return true ; // 如果每位數都都等於0( 同i[] % j[] == 0 ) ,則不為質數
}
現在問題是
isPrime 一直傳true
divides一直傳false
導致每個數都會印出來(題目要求要質數)
ex : 我輸入 123    321 應該要跑出123~321中的質數,但卻是跑出...123 124 125.....321
     isPrime傳true回來,所以就不斷的印出...(debug兩天,還是沒de出來,懷疑是isPrime divides zero 這幾個有可能出問題)
ps:題目還有要求要輸出到一個檔案(file),那個我先擱著,先看印出來東西對不對,對了後,在輸出至檔案!

本文最後由 kimiyoko 於 2017-9-28 16:53 編輯

原 來 " 平 淡 " 也 可 以 這 麼 美 好 ! !
已完成
目前只有個小....bug,outputf那邊的outfile使用完後,下面如果沒打個outfile << endl ; ,  文件夾中的數字就會變成亂碼...
本文最後由 kimiyoko 於 2017-9-28 16:53 編輯

原 來 " 平 淡 " 也 可 以 這 麼 美 好 ! !
10#
kone1233 2010-10-29 20:00 只看這個作者
我幫不了你  

留給樓下專業的166.gif