1. 程式人生 > >C語言第五次博客作業

C語言第五次博客作業

能夠 flag 中大 哪裏 就是 提交 情況 位數 在哪裏

一、PTA實驗作業

題目1:6-6 使用函數輸出水仙花數

1. 本題PTA提交列表

技術分享圖片

2. 設計思路

  • (1) 首先先定義narcissistic函數。
  • (2)定義四個整形變量n,a,d,cnt,sum,cnt用來計算有幾位數,sum用來存放每個數的cnt次方的和。
  • (3)進行一個循環,讓n=number(防止後面需要用number時它的值發生變化),循環中n=n/10,直到
    n<=0結束循環,其中每次循環cnt值都加一,用來計算number有幾位數。
  • (4)再進行一個for循環(讓a=number;直到a不>0;a/=10)
    在循環中d=a%10;sum=sum+pow(d,cnt);這部是讓每個位數的cnt次方進行相加。
  • (5)這裏在進行一個判斷,如果nunber=sum則說明這個數是水仙花數,則return 1;
    否則就return 0;
  • (6)再進行void PrintN( int m, int n )函數的定義。
  • (7)定義一個變量i 用來進行循環
  • (8)for(i=m+1;i<n;i++)做循環讓它輸出這個範圍內的水仙花數。
    因為在這個區間裏的水仙花數不能取m和n,所以給i定義的初值為m+1,
    限定條件為i<n。
  • (9)if( narcissistic(i) )調用上一個函數 ,判斷i是否為水仙花數
    printf("%d",i);printf("\n")如果是輸出這個數,並換行。

    3.本題調試過程碰到問題及PTA提交列表情況說明

  • (1)當時在編譯這題時,一開始就打算用cnt 來計算number的值。
    可是在做題目時一直根據題目給的值153,就把在第4步時把那個cnt輸成了3
    結果一直導致部分正確。
    技術分享圖片
    技術分享圖片

其中大於三位數後水仙花數就輸不出來

  • (2)還有一個問題就是在判斷完它是水仙花數後不知道要怎樣返回這個值。
    後開嘗試用了下return 1就可以了,運氣有些好。

    題目2:6-8 使用函數輸出指定範圍內的Fibonacci數

    1. 本題PTA提交列表

    技術分享圖片

2. 設計思路

  • (1)int fib( int n )首先定義fib函數
  • (2)int a=1,b=1,i.定義三個整形變量(因為題目所給的內容,a,b的初始值都為1,i是後面用來做循環
  • (3) if(n==1 || n==2)return 1;如果n=1,n=2時Fibonacci數都為1
  • (4)for(i=3;i<=n;)再進行一個循環,令i=3直到i>n時結束循環。
  • (5) a=a+b;i=i+1;b=b+a;i++;這樣就能夠讓前面兩個數的值相加成第三個數。
  • (6)如果n為奇數則就return a的值
  • (7)為偶數就輸出偶數的值
  • (8)void PrintFN( int m, int n )再進行void PrintFN函數的定義
  • (9)int cnt=0,i,j定義三個整形變量i,j,用來進行循環,cnt 是用來判斷這個區間內是否有Fibonacci數
  • (10)for(i=1;fib(i)<=n;i++) if(fib(i)>=m) printf("%d",fib(i))讓每一個Fibonacci數都與m進行比較
  • (11)如果fib(i)>=m,就說明這個Fibonacci數在區間內,則輸出fib(i)
  • (12)if(fib(i+1)<=n) printf(" ");在區間內最後一個Fibonacci數前輸入“——”滿足行末沒有空格。
    並且在這個if語句中讓cnt=1
  • (13)再循環外進行一個判斷語句如果cnt=0則輸出No Fibonacci number。

    3.本題調試過程碰到問題及PTA提交列表情況說明

    技術分享圖片

對於行末不能保留空格一開始沒有註意到,所以只在其為空集時正確了
技術分享圖片

於是我在輸出空格前進行了一次判斷,如果fib(i+1)<n則說明這個數是區間內倒數第二個數,那麽在下一個數的後面就不要再輸出空格。
可是,還有錯誤就是兩端點都是F數,測試超過區間的fib不滿足條件
技術分享圖片

所以我就再看了下題目題目中如果m,n是Fibonacci數那麽他也是需要輸出的。所以在)if(fib(i+1)<n)中加了一個=。就滿足條件。

題目1:6-7 使用函數輸出指定範圍內的完數

1. 本題PTA提交列表

技術分享圖片

2. 設計思路

本題要求實現一個計算整數因子和的簡單函數

  • (1)int factorsum( int number )定義這個函數來判斷一個數是否為函數
  • (2)int i,sum=0;定義sum用來存放因子相加後的值
  • (3)if(number==1) return 1;因為1是一定滿足有有點特殊,首先拿出來考慮
  • (4) for(i=1;i<number;i++) if(number%i==0) sum=sum+i;進行一個循環在<n的範圍內而不能=n,
    所以1是有點特殊,後面一個判斷語句是將i的因子全部相加。
  • (5)if(sum==number)則說明這個數是完數,那麽就return sum.否則return 0;
  • (6)void PrintPN( int m, int n )在進行這個函數的定義
  • (7)int i,j,a=1。i,j是用來進行循環,a是用來判斷區間內是否有完數
    -(8)for(i=m;i<=n;i++) if(factorsum(i) == i)則說明這個數是完數,則printf("%d = 1",i) 因為任何完數都會等於1+多少。
    -(9)for(j=2;j<i;j++)在進行一個循環 if(i%j==0)這個是用來判斷i的因子,如果是則printf(" + %d",j)
  • (10)然後在j循環外printf("\n")換行。並使a=0
  • (11)進行一個判斷if(a==1)就printf("No perfect number")

    3.本題調試過程碰到問題及PTA提交列表情況說明

    技術分享圖片

這道題的難點在於 完數 = 因子1 + 因子2 + ... + 因子k 這個格式的輸出怎樣才能讓它正確輸出因子的同時,又正確的輸出+與空格。
經過觀察每個數必有因子1," + %d",j 在以這樣的格式一個個輸出,我一開始是在每個數的後面加空格,這樣導致行末出現空格,
後來經過一個同學的提點,把空格放在+的前面這樣就不會在行末出現空格。
技術分享圖片

技術分享圖片

行末出現空格

二、同學代碼結對互評

技術分享圖片

2.我的代碼、互評同學代碼截圖

我的代碼!

int fib( int n )
{
    int a=1,b=1,i;
    if(n==1 || n==2){//如果n=1,2時F數都為1
        return 1;
    }
    for(i=3;i<=n;){
        a=a+b;//讓前兩個數相加得到一個新的數
        i=i+1;
        b=b+a;
        i++;
    }
    if(n%2==0){//判斷奇偶數
        return b;
    }
    else{
        return a;
    }
}
void PrintFN( int m, int n )
{
    int cnt=0,i,j;
    for(i=1;fib(i)<=n;i++){
        if(fib(i)>=m){
            printf("%d",fib(i));
            if(fib(i+1)<=n){
              printf(" ");
            }
            cnt=1;
        } 
    }
    if(cnt==0){
        printf("No Fibonacci number");
    }
}

黃炳煒的代碼

int fib( int n )
{
    int result=0,i,a=1,b=1;
    if(n==1)return 1;
    for(i=2;i<=n;i++)
    {
        result=b;
        b=b+a;
        a=result;
    }
    return result;
}

void PrintFN( int m, int n )
{
   int f,i,flag=0,c=0;//f放完數,i控制循環,利用flag判斷是否有完數,c,判斷是否為第一個數 
   for(i=1;i<=100;i++)
   {
    f=fib(i);
    if(f>=m&&f<=n)//完數在所給範圍內 
    {
        c++;
        flag=1;
        if(f==1&&m==1&&i==1)//起始點為1比較特殊,直接輸出1 
       {
        printf("1");
        continue;
       }
       if(c==1)//第一個數前面沒有空格,所以單獨輸出 
       {
        printf("%d",f);
        continue;
       }
       
    printf(" %d",f);
    flag=1;
    }
    
   }
   if(flag==0)//沒有完數,則flag還是為0,輸出。 
        printf("No Fibonacci number");
}

3.我和同學代碼不同在哪裏?有哪些各自優勢?你更喜歡哪種代碼風格?如果同學代碼有錯的也請幫忙指出來哪裏出問題

不同點:我和炳煒同學在定義fib函數的做法不一樣,我是讓n從三開始進行循環a=a+b,i++,b=b+a,i++當n為奇數時其F數再a上,
偶數時F數再b上。
而炳煒同學是在定義一個變量來存放fib數,result=b; b=b+a; a=result它的循環是從2開始先讓result=b,每次都讓b=b+a,又再將a=result
這樣同樣巧妙的將前兩個數的和放到了result上
優勢:1:我的代碼在一步的循環中就能計算多個F數,剪短了循環的時間,並且我不用多定義一個變量也節省了空間。
而,炳煒同學的代碼比較精煉,不需要在後面做判斷,直接返回result,而我的有兩個出口。
2:在第二個函數上,我覺得我的優勢會更大,在第一個循環我結束的條件是fib(i)<=n而炳煒同學i<=100,這樣 它循環的次數就會更多,時間更長。
然後為了避免在行末輸出空格if(fib(i+1)<=n) printf(" ");我是來找nm 區間內的倒數第二個數,而他是讓第一個數單獨輸出,還要多設計一個數來判斷區間內的第一個數
總之,它的代碼使用的空間和時間都用的比我多。
所以,我會更喜歡我自己的代碼。

三、截圖本周題目集的PTA最後排名。

技術分享圖片

C語言第五次博客作業