Yahoo 知識+ 將於 2021 年 5 月 4 日 (美國東岸時間) 停止服務,而 Yahoo 知識+ 網站現已轉為僅限瀏覽模式。其他 Yahoo 資產或服務,或你的 Yahoo 帳戶將不會有任何變更。你可以在此服務中心網頁進一步了解 Yahoo 知識+ 停止服務的事宜,以及了解如何下載你的資料。

?
Lv 5
? 發問於 電腦與網際網路程式設計 · 7 年前

分開數字C++

我是這樣寫的,可以跑,不過我知道一定有很多地方寫的不好,請告訴我哪裡需改進。不過因為int的限制,只能跑10位數,請教我怎麼寫得更快,同時又能跑更多數字。

#include <iostream>

#include <cmath>

using namespace std;

int* decomposeDig(int);

int main(void)

{

int input;

int* arr;

cout << "Enter a number, and it will be decomposed" << endl;

cin >> input;

arr = decomposeDig(input);

for (int k = 1; k <= arr[0]; k++)

{

cout << "No." << k << "digit(From right): " << arr[k] << endl;

}

return 0;

}

int* decomposeDig(int in)

{

static int ar[20];

int inp = in;

ar[0] = (int) log10 ((double) in) + 1; //count amount of digits

cout << ar[0] << endl;

for (int i = 1; i <= ar[0]; i++)

{

ar[i] = inp % 10;

inp /= 10;

}

return ar;

}

更新:

請問對'0'的表示法會有什麼問題? 我不太懂

還有,如果回傳pointer to static 不好的話,該怎麼寫?

p大的程式碼太簡潔了><,看不懂,可以麻煩你解釋一下嗎,謝謝!

4 個解答

評分
  • 7 年前
    最愛解答

    #include <stdio.h>

    #include <iostream>

    using namespace std;

    unsigned char *

    decomp(

    unsigned char *ar,

    unsigned long x

    ){

    sprintf((char*)&ar[1],"%lu",x);

    for(ar[0]=0,x=1;ar[x];ar[x++]-='0',++ar[0]);

    if (1==ar[0] && 0==ar[1]) ar[0]=0;

    return ar;

    }

    int main(void) {

    unsigned char x[64];

    for(unsigned long y ;

    cout << "Enter a number: " &&

    cin >> y &&

    y > 0 ;

    ){

    int i,j,s;

    (void) decomp(x,y);

    for(i=x[0],j=1,s=0;i--;s+=x[j],++j)

    cout << (unsigned)x[j] << ' ';

    if (10==s) cout << " is perfect" << endl;

    else cout << " is not perfect" << endl;

    }

    return 0;

    }

    2014-04-29 00:58:36 補充:

    妳這方法 對'0'的表示法,早晚會是一個頭痛的問題吧!??

    2014-04-30 08:23:25 補充:

    > 請問對'0'的表示法會有什麼問題? 我不太懂

    用你的方式,"0"有2個表示法(1)100 (2)00 夠麻煩了吧?

    > 還有,如果回傳pointer to static 不好的話,該怎麼寫?

    這會讓你的程式non-re-entrant 夠麻煩了吧? 該怎麼寫? 就像我寫的一樣就好了吧!

  • 7 年前

    參考下面的網址看看

    http://phi008780520.pixnet.net/blog

  • 7 年前

    參考下面的網址看看

    http://phi008780508.pixnet.net/blog

  • 7 年前

    不提演算法改進, 提程式寫法的改進.

    1. 函式設計成回傳pointer to static local,

    在multithread下是不安全的, 盡可能不要這樣寫,

    若以後有需要用在multithread, 這函式到時候又要改.

    2014-04-29 09:15:02 補充:

    2. 函式回傳pointer會破壞封裝性,

    因為除了回傳pointer to static local variable,

    也可能回傳pointer to dynamic memory,

    呼叫者有責任知道要delete還是free還是不能呼叫釋放動作,

    使得呼叫者要看函式的implementation才會知道.

    以我自己的習慣回傳pointer只用在factory function.

    若改成回傳reference, 可解決破壞封裝性的問題,

    不過一樣有第1點的thread not safe問題.

還有問題嗎?立即提問即可得到解答。