亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 一道筆試:階乘比較 [打印本頁(yè)]

作者: drowsyboy    時(shí)間: 2007-05-31 18:13
標(biāo)題: 一道筆試:階乘比較
記得以前在CU上看到過(guò),有關(guān)大數(shù)階乘計(jì)算的文章,這道題目應(yīng)該沒(méi)有那么難,給各位大人小練一下。

題目是這樣的:

寫一個(gè)程序,接受兩個(gè)輸入比如 12。。。! 和 3。。!,這里輸入,一定是由一個(gè)大于0的整數(shù)和!符號(hào)組成,!表示階乘(3!表示3階乘后再求階乘,依次類推)

程序要實(shí)現(xiàn)的就是要比較兩個(gè)輸入數(shù)的大小。

呵呵,不知道說(shuō)清楚沒(méi)有:)
作者: MMMIX    時(shí)間: 2007-05-31 18:18
原帖由 drowsyboy 于 2007-5-31 18:13 發(fā)表
記得以前在CU上看到過(guò),有關(guān)大數(shù)階乘計(jì)算的文章,這道題目應(yīng)該沒(méi)有那么難,給各位大人小練一下。

題目是這樣的:

寫一個(gè)程序,接受兩個(gè)輸入比如 12!。。。 和 3。。!,這里輸入,一定是由一個(gè)大于0的 ...

啥公司出這種考數(shù)學(xué)的題目?
作者: ypxing    時(shí)間: 2007-05-31 18:23
原帖由 drowsyboy 于 2007-5-31 18:13 發(fā)表
記得以前在CU上看到過(guò),有關(guān)大數(shù)階乘計(jì)算的文章,這道題目應(yīng)該沒(méi)有那么難,給各位大人小練一下。

題目是這樣的:

寫一個(gè)程序,接受兩個(gè)輸入比如 12。。。! 和 3。。!,這里輸入,一定是由一個(gè)大于0的 ...


說(shuō)清楚了,感覺(jué)是挺簡(jiǎn)單的
作者: MMMIX    時(shí)間: 2007-05-31 18:25
原帖由 ypxing 于 2007-5-31 18:23 發(fā)表


說(shuō)清楚了,感覺(jué)是挺簡(jiǎn)單的

說(shuō)說(shuō)詳細(xì)算法吧。
作者: doni    時(shí)間: 2007-05-31 18:32
12!。。! 和 3。。!
應(yīng)該就是比12!和3吧
作者: ypxing    時(shí)間: 2007-05-31 18:33
原帖由 MMMIX 于 2007-5-31 18:25 發(fā)表

說(shuō)說(shuō)詳細(xì)算法吧。


說(shuō)說(shuō)我的想法吧,
這么大的數(shù),我會(huì)選擇用字符串表示
比如"4!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"

有兩個(gè)這樣的數(shù)的話,
比如3!!!!和5!!!
我會(huì)先比較它們!的個(gè)數(shù)
然后,我會(huì)比較3! 和5 (就是去掉相同個(gè)!后)

這樣,后面的就比較容易比較了
作者: namei    時(shí)間: 2007-05-31 18:39
原帖由 ypxing 于 5/31/2007 18:33 發(fā)表


說(shuō)說(shuō)我的想法吧,
這么大的數(shù),我會(huì)選擇用字符串表示
比如"4!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"

有兩個(gè)這樣的數(shù)的話,
比如3!!!!和5!!!
我會(huì)先比較它們!的個(gè)數(shù)
然后,我會(huì)比較3! 和5 ( ...



要不咱先估計(jì)一下4!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!有多少十進(jìn)制位
作者: MMMIX    時(shí)間: 2007-05-31 18:39
原帖由 ypxing 于 2007-5-31 18:33 發(fā)表


說(shuō)說(shuō)我的想法吧,
這么大的數(shù),我會(huì)選擇用字符串表示
比如"4!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"

有兩個(gè)這樣的數(shù)的話,
比如3!!!!和5!!!
我會(huì)先比較它們!的個(gè)數(shù)
然后,我會(huì)比較3! 和5 ( ...

沒(méi)錯(cuò),樓主的問(wèn)題可以簡(jiǎn)化為如下:

給定正整數(shù) n1, n2, 問(wèn)當(dāng)什么情況下 n1 >= n2!...! ? (假設(shè)有 n 個(gè) !,n 為正整數(shù))

這個(gè)問(wèn)題怎么解決呢?
作者: MMMIX    時(shí)間: 2007-05-31 18:41
原帖由 doni 于 2007-5-31 18:32 發(fā)表
12。。。! 和 3。。!
應(yīng)該就是比12!和3吧

嗯,正整數(shù)上的 ! 運(yùn)算是嚴(yán)格單增的。
作者: ypxing    時(shí)間: 2007-05-31 18:42
原帖由 namei 于 2007-5-31 18:39 發(fā)表



要不咱先估計(jì)一下4!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!有多少十進(jìn)制位


所以,字符串伺候之
作者: ypxing    時(shí)間: 2007-05-31 18:44
原帖由 MMMIX 于 2007-5-31 18:39 發(fā)表

沒(méi)錯(cuò),樓主的問(wèn)題可以簡(jiǎn)化為如下:

給定正整數(shù) n1, n2, 問(wèn)當(dāng)什么情況下 n1 >= n2!...! ? (假設(shè)有 n 個(gè) !,n 為正整數(shù))

這個(gè)問(wèn)題怎么解決呢?


這個(gè)問(wèn)題這樣解決,
求滿足n3!<n1<n4!的最大的n3和最小的n4
n3和n4是比較好求的,
然后再進(jìn)行比較

[ 本帖最后由 ypxing 于 2007-5-31 18:52 編輯 ]
作者: parkerchou    時(shí)間: 2007-05-31 19:10
那么大的數(shù)如何階乘啊?!
曾經(jīng)有看過(guò)一個(gè)高手寫了一 個(gè)能在普通pc上算1000階乘的代碼,經(jīng)研究后發(fā)現(xiàn)也是有局限性的。
階乘的結(jié)果最多是32767位。
代碼如下:
#include   <stdio.h>   
#define   max   32767   
main()   
{         
        int   n;   
        int   sum=0;   
        int   a[max+1];                              
        int   i,j,k,x;
        while   (1)   
          {   
                  printf(   "輸入要求階乘的數(shù):   "   );   
                  scanf   (   "%d",   &n   );   
                    k=max;   
                  a[k]=1;   
                  for(i=2;i<=n;i++)                     
                  {   
                          x=0;                                         
                          for(j=max;j>=k;j--)   
                          {   
                          x=a[j]*i+x;                  
                          a[j]=x%10;                                                     
                          x=x/10;                           
                         }   
                 while(x>0)                             
                 {   
                          k--;   
                          a[k]=x%10;   
                          x=x/10;   
                 }
        }
//輸出   
                for(i=k;i<=max;i++)   
                {   
                        printf(   "%d",   a[i]   );   
                }   
                printf(   "\n"   );   
        }   
        return   0;   
}


小弟對(duì)他的算法佩服得5體投地!
作者: MMMIX    時(shí)間: 2007-05-31 19:28
原帖由 ypxing 于 2007-5-31 18:44 發(fā)表


這個(gè)問(wèn)題這樣解決,
求滿足n3!<n1<n4!的最大的n3和最小的n4
n3和n4是比較好求的,
然后再進(jìn)行比較

感覺(jué)距離解決遙之又遙。
作者: ypxing    時(shí)間: 2007-05-31 19:34
原帖由 MMMIX 于 2007-5-31 19:28 發(fā)表

感覺(jué)距離解決遙之又遙。


如果n1是個(gè)任意大的數(shù),大過(guò)計(jì)算機(jī)對(duì)整數(shù)的表示能力,就比較難解決
但如果n1小于等于計(jì)算機(jī)對(duì)整數(shù)的表示能力,問(wèn)題很簡(jiǎn)單
作者: MMMIX    時(shí)間: 2007-05-31 19:36
原帖由 ypxing 于 2007-5-31 19:34 發(fā)表


如果n1是個(gè)任意大的數(shù),大過(guò)計(jì)算機(jī)對(duì)整數(shù)的表示能力,就比較難解決
但如果n1小于等于計(jì)算機(jī)對(duì)整數(shù)的表示能力,問(wèn)題很簡(jiǎn)單

這樣啊,那你直接給個(gè)完整的實(shí)現(xiàn)得了,就假設(shè) n1 是 int 型的。
作者: red999    時(shí)間: 2007-06-05 09:48
如果只是比較大小的話,個(gè)人感覺(jué)沒(méi)必要將階乘全部算出來(lái),
這里說(shuō)下個(gè)人的想法:
這里我把一個(gè)!叫做“1階”;
首先我們可以將較低的階數(shù)“約掉”,
例如,3!!!!!!!!!和4!!!!!!!,通過(guò)判斷可以知道分別是9階和7階,那么我們可以“約掉”7階
也就是說(shuō)只要比較3!!和4就可以了。
其次,約掉之后也沒(méi)必要算出,畢竟如果兩個(gè)數(shù)的階數(shù)相差太大,那么還是不能忍受的,那我
們可以這樣,將需要階乘的那個(gè)數(shù)從0階開(kāi)始,每計(jì)算一階就和不需階乘的數(shù)做比較,那么還是
這樣的結(jié)果我覺(jué)得可以完全可以接受。
作者: drowsyboy    時(shí)間: 2007-06-05 16:45
呵呵,我只是發(fā)上來(lái),大家討論下~,這幾天過(guò)六一節(jié)去了
作者: drowsyboy    時(shí)間: 2007-06-05 16:48
標(biāo)題: 貼下我的當(dāng)時(shí)答題的代碼
#include <stdio.h>
#include <stdlib.h>
/**************************************************************************
* function : get_element
*
* Discription:
*        the function is used to extract elemnts from formatted string
*       
* Input parameters:
*        char *pstr:         the input string
*        int *value:         record the value
*       int *length:         record the length of (!)
*       
* Output parameters:
*        void
*
* Author: Created by huzza.hu May.30th.2007
**************************************************************************/
static void get_element( char *pstr, int *value, int *length)
{
        int string_len = strlen( pstr );
        int i = 0;
       
        *value = 0;
        *length = 0;
       
        while ( i < string_len ){
                if ( pstr[i] != '!'){
                        *value = (*value)*10 + pstr[i] - '0';
                }
                else{
                        break;
                }
               
                i++;       
        }

        while ( i < string_len ){
                (*length) ++;

                i++;
        }               
}

/**************************************************************************
* function : calfac
*
* Discription:
*       the function is used to calculate the factorial of base
*
* Input parameters:
*      int base: the base value
*
* Output parameters:
*      int : the factorial of base
*
* Author: Created by huzza.hu May.30th.2007
**************************************************************************/
static int calfac( int *base, int compval )
{
        int i = *base;
        int calvalue=1;
       
        for( ; i > 1 ; i-- ){
                calvalue = calvalue * i;
                if ( calvalue > compval ){
                        return 1;
                }       
        }
       
        *base = calvalue;

        return 0;
}

/**************************************************************************
* function : compare
*
* Discription:
*       the function is used to compare the elements
*
* Input parameters:
*        char *pa: the first input parameters
*        char *pb: the second input paramters

* Output parameters:
*       int: if (*pa > *pb) return 1
*             esle        retrun 0
*
* Author: Created by huzza.hu May.30th.2007
**************************************************************************/
int compare(char *pa, char *pb)   //no static here, so can be called by other program
{
        int iCompa, iCompb;
        int numa, numb;
        int min = 0;
        int result = 0;
       
        get_element( pa , &iCompa, &numa);
        get_element( pb , &iCompb, &numb);
       
        printf("%d,the length of (!) is:%d\n", iCompa, numa);
        printf("%d,the length of (!) is:%d\n", iCompb, numb);
       
        min = (( numa > numb ) ? numb:numa);
        numa = numa - min;
        numb = numb - min;

        result = ( iCompa > iCompb );
       
        if ( 0 == numa ){
                while( numb > 0 ){
                        result = calfac( &iCompb, iCompa );
                        if ( 1 == result ){
                                result = 0;
                                break;
                        }
                        else{
                                result = 1;
                        }
                        numb--;
                }
        }
        else{
                while( numa > 0 ){
                        result = calfac( &iCompa, iCompb );
                        if ( 1 == result){
                                break;
                        }
                        else{
                                result = 0;
                        }
                        numa--;
                }
        }       
       
        return result;  
}

/**************************************************************************
* function : main
*
* Discription:
*       the function is used to get the input of customer and output the result
*
* Input parameters:
*        void
*
* Output parameters:
*       int: error code
*             0 no error; >0 error
*
* Author: Created by huzza.hu May.30th.2007
**************************************************************************/
int main(void)
{
        char acCompa[128];
        char acCompb[128];
        int flag = 0;

        printf("please input two compares:\n");
        scanf("%s", acCompa);
        scanf("%s", acCompb);

        printf("number1:%s\n", acCompa);
        printf("number2:%s\n", acCompb);

        flag = compare(acCompa, acCompb);
       
        printf("%s is bigger than %s.\n", (flag == 1) ? acCompa:acCompb,(flag == 1) ? acCompb:acCompa);
       
        return 0;
}




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2