Yahoo 知識+ 將於 2021 年 5 月 4 日 (美國東岸時間) 停止服務,而 Yahoo 知識+ 網站現已轉為僅限瀏覽模式。其他 Yahoo 資產或服務,或你的 Yahoo 帳戶將不會有任何變更。你可以在此服務中心網頁進一步了解 Yahoo 知識+ 停止服務的事宜,以及了解如何下載你的資料。
分開數字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 個解答
- prisoner26535Lv 77 年前最愛解答
#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 年前
不提演算法改進, 提程式寫法的改進.
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問題.