牛客網機試題:N的階乘

N的階乘

題目描述

輸入一個正整數N,輸出N的階乘

輸入描述:

正整數N(0<=N<=1000)

輸出描述:

輸入可能包括多組數據,對於每一組輸入數據,輸出N的階乘

輸入

4   5   15

輸出

24   120   1307674368000

#include <stdio.h>
#define N 10000
 
int main()
{
    int res[1000];    //res[1000]數組的每一個元素都記錄N進制的1位
                      //其中N爲10的乘方,輸出結果剛好可以用十進制表示
                      //由於N是10的乘方,該N進制的符號是十進制符號的組合
                      //就好像時是16進制可以用4個二進制位表示一樣,
                      //要注意保證res數組中所有元素都是4位,出了最高位的前綴0要去除

    int n,bit,carry;               //bit表示當前運算結果的最高位,即res數組不爲0的最大下標
                                   //carry表示進位的結果
    int i,j;
    while(~scanf("%d",&n))
    {
        bit= 0
        res[bit] = 1;              //開始res數組應該表示1,階乘,初始值存1,加法初始值存0,其中只需要初始化數組的第一個元素就行了
        for(i =1;i<=n;i++)
        {
            carry = 0;
            for(j =0;j<=bit;j++)
            {
                res[j] = res[j]*i + carry;      //每一位的結果是當前位乘以乘數在加上進位的結果
                                                //第一位運算時進位爲0,將carry初始化爲0
                carry = res[j] / N;   
                                                //將當前位的運算結果分解爲當前位和高一位存入當前位和carry
                res[j] = res[j] % N;
            }
            if(carry) res[++bit] = carry;       //依次從當前位到最高位計算,最高位可能產生進位
        }
        for(printf("%d",res[bit]);bit;printf("%04d",res[--bit]));
            printf("\n");
    }
    return 0;
}

printf() 格式控制符:

% [flag] [width] [.precision] type
[ ] 表示此處的內容可有可無,是可以省略的

1) type 表示輸出類型

比如 %d、%f、%c、%lf,type 就分別對應 d、f、c、lf;再如,%-9d中 type 對應 d

type 這一項必須有

2) width 表示最小輸出寬度

就是至少佔用幾個字符的位置;如:%-9d中 width 對應 9,表示輸出結果最少佔用 9 個字符的寬度

當輸出結果的寬度不足 width 時,以空格補齊(如果沒有指定對齊方式,默認會在左邊補齊空格);

當輸出結果的寬度超過 width 時,width 不再起作用,按照數據本身的寬度來輸出;

width 的用法:

#include <stdio.h>

int main()
{
    int n = 234;
    float f = 9.8;
    char c = '@';
    char *str = "chinachinachinachina";
    printf("%10d%12f%4c%8s", n, f, c, str);
    return 0;
}

運行結果:

       234    9.800000   @chinachinachinachina

對輸出結果的說明:

  • n 的指定輸出寬度爲 10,234 的寬度爲 3,所以前邊要補上 7 個空格。
  • f 的指定輸出寬度爲 12,9.800000 的寬度爲 8,所以前邊要補上 4 個空格。
  • str 的指定輸出寬度爲 8,"chinachinachinachina" 的寬度爲 20,超過了 8,輸出寬度不再起作用,按照 str 的實際寬度輸出

3) .precision 表示輸出精度,也就是小數的位數

  • 當小數部分的位數大於 precision 時,會按照四捨五入的原則丟掉多餘的數字;
  • 當小數部分的位數小於 precision 時,會在後面補 0。

另外,.precision 也可以用於整數和字符串,但是功能卻是相反的:

  • 用於整數時,.precision 表示最小輸出寬度。與 width 不同的是,整數的寬度不足時會在左邊補 0,而不是補空格。
  • 用於字符串時,.precision 表示最大輸出寬度,或者說截取字符串。當字符串的長度大於 precision 時,會截掉多餘的字符;
  • 當字符串的長度小於 precision 時,.precision 就不再起作用
#include <stdio.h>

int main()
{
    int n = 123456;
    double f = 882.923672;
    char *str = "abcdefghi";
    printf("n: %.9d %.4d\n", n, n);
    printf("f: %.2lf %.4lf %.10lf\n", f, f, f);
    printf("str: %.5s %.15s\n", str, str);
    return 0;
}

運行結果:

n: 000123456  123456
f: 882.92  882.9237  882.9236720000
str: abcde  abcdefghi

輸出結果說明:

  • 對於 n,.precision 表示最小輸出寬度。n 本身的寬度爲 6,當 precision 爲 9 時,大於 6,要在 n 的前面補 3 個 0;當 precision 爲 4 時,小於 6,不再起作用。
  • 對於 f,.precision 表示輸出精度。f 的小數部分有 6 位數字,當 precision 爲 2 或者 4 時,都小於 6,要按照四捨五入的原則截斷小數;當 precision 爲 10 時,大於 6,要在小數的後面補四個 0。
  • 對於 str,.precision 表示最大輸出寬度。str 本身的寬度爲 9,當 precision 爲 5 時,小於 9,要截取 str 的前 5 個字符;當 precision 爲 15 時,大於 9,不再起作用。

4) flag 是標誌字符

%#x中 flag 對應 #,%-9d中 flags 對應-。下表列出了 printf() 可以用的 flag

標誌字符 含  義
- -表示左對齊。如果沒有,就按照默認的對齊方式,默認一般爲右對齊
+ 用於整數或者小數,表示輸出符號(正負號)。如果沒有,那麼只有負數纔會輸出符號
空格 用於整數或者小數,輸出值爲正時冠以空格,爲負時冠以負號
#

對於八進制(%o)和十六進制(%x / %X)整數,# 表示在輸出時添加前綴;八進制的前綴是 0,十六進制的前綴是 0x / 0X。

對於小數(%f / %e / %g),# 表示強迫輸出小數點。如果沒有小數部分,默認是不輸出小數點的,加上 # 以後,即使沒有小數部分也會帶上小數點。

#include <stdio.h>

int main()
{
    int m = 192, n = -943;
    float f = 84.342;
    printf("m=%10d, m=%-10d\n", m, m);   //演示 - 的用法
    printf("m=%+d, n=%+d\n", m, n);      //演示 + 的用法
    printf("m=% d, n=% d\n", m, n);      //演示空格的用法
    printf("f=%.0f, f=%#.0f\n", f, f);   //演示#的用法
    return 0;
}

運行結果:

m=       192, m=192      
m=+192, n=-943
m= 192, n=-943
f=84, f=84.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章