我正在嘗試用 C 撰寫我的第一個排序演算法,我對它比較陌生,所以這可能是一項超出我的努力,但我認為我可以處理它。當給定輸入 0 時,此代碼回傳數字,例如 701635989630、6560204700 和 1.8*10^19。這對我來說根本沒有意義,我問過 IRL 的人也沒有。
編輯 - @Slava 提出了最好的建議,在他的幫助下,我現在 5 次中有 4 次可以正常作業,但在第 5 次仍然失敗
#include <cinttypes>
uint64_t descendingOrder(uint64_t a)
{
std::vector<int> digits;
for( auto tmp = a; tmp; tmp /= 10 ){
digits.push_back( tmp % 10 );
}
bool run = true;
//sort the array
while (run) {
bool change = false;
for (unsigned long z = 1; z < std::size(digits); z){
if (digits[z]>digits[z-1]){
unsigned long temp = digits[z];
digits[z] = digits[z-1];
digits[z-1] = temp;
change = true;
};
};
if (change == false){
run = false;
};
};
int finSort = 0;
for (unsigned long i = 0; i < std::size(digits); i ) {
finSort *= 10;
finSort = digits[i];
}
return finSort;
}
uj5u.com熱心網友回復:
int arrayLength = sizeof(array);是不是你的想法。它不回傳 的大小array,而是回傳所array消耗的位元組數。
此外,也不int array[n]是有效的 C ,因為必須在編譯時知道 C 中陣列的大小。如果要創建一個在運行時已知大小的陣列,請考慮使用. 您只需要更改為:std::vectorint array[n]
std::vector<int> array;
array.resize(n);
uj5u.com熱心網友回復:
我將對代碼進行以下兩項更改:
int array[20]; // a 64 bit integer won't have more than 20 digits
int arrayLength = n; // we just calculated this
uj5u.com熱心網友回復:
如果您使用適當的工具 -std::vector在這種情況下,您的代碼將被簡化并且更容易撰寫和閱讀,因為它std::vector可以動態增長:
uint64_t descendingOrder(uint64_t a)
{
std::vector<int> digits;
for( auto tmp = a; tmp; tmp /= 10 )
digits.push_back( tmp % 10 );
// your sorting code is here
}
現在你的數字在 vector 中digits,你的陣列大小在digits.size(),你不需要 2 個回圈。雖然向量中的數字順序相反,但在您的情況下并不重要,因為您需要對其進行排序。
uj5u.com熱心網友回復:
僅通過首先查看您的代碼片段,我就可以發現兩個錯誤:
錯誤一
在 C 中,陣列的大小必須是編譯時常量。所以你不能寫這樣的代碼:
int n = 10;
int arr[n]; //incorrect
正確的寫法是:
const int n = 10;
int arr[n]; //correct
出于同樣的原因,以下代碼在您的代碼中也不正確:
int array[n]; //incorrect because n is not a constant expression
錯誤 2
您錯誤地計算了陣列的大小。正確的做法是使用std::sizeC 17 或使用公式
int arrayLength = sizeof(array)/sizeof(int);//will work with all C versions
或使用 C 17:
int arrayLength = std::size(array); //works in C 17 and higher
您可以/應該改為使用可變大小的容器,例如std::vector.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/341248.html
下一篇:從字串到鋸齒狀的字符陣列
