我試圖將序列的數字分開,並將它們全部存儲在一個數組中。
對於我所看到的 C 語言,我沒有做錯任何事情,並且程序編譯得很好,但是在打印數字的那一刻,它就不起作用了。
我試圖做的事情的解釋在最後。
long int number;
do
{
number = get_long("number:\n");
}
while (number<1 || number>9999999999999999);
int numbers[16], n;
//We separate the numbers, from right to left
for (long int I=10; I>100000000000000000; I*=10)
{
for (long int J=1; J>100000000000000000; J*=10)
{
for (n=0; n>16; n++)
{
numbers[n]=(number%I)/J;
}
}
}
printf("%i\n", numbers[1]);
它應該接受 1 位到 16 位的數字,並將每個數字分開。
例如,如果我們有16
,它會分離1
,並6
分為兩個數字,使得6
第一個數字,而1
第二個,所以要離開它會開始從右計數。它應該將每個數字存儲在 16 個空格的數組中。然後我只打印第二個數字,以確保它確實有效,但是當我運行它時,它只會給我0
;這意味著它不起作用,但我認為它沒有問題。
可能是我太缺乏經驗,或者我沒有必要的知識,無法在代碼中看到問題。
>
轉到 後<
,即使只有 16 位數字,您最終也會對內部循環的主體進行 16*16*16 = 4096 次求值。應該只有 16 次迭代的一個循環。long int
is not 僅保證支持最多2,147,483,647
. 相反,使用的一個long long int
,int_least64_t
或者int64_t
,或者其對應的無符號之一。您試圖編寫以下內容:
uint64_t mod = 10; // Formerly named I
uint64_t div = 1; // Formerly named J
for (int n=0; n<16; ++n) {
numbers[n] = ( number % mod ) / div;
mod *= 10;
div *= 10;
}
但這比需要的要復雜一些。讓我們交換除法和模數的順序。
uint64_t div = 1;
for (int n=0; n<16; ++n) {
numbers[n] = ( number / div ) % 10;
div *= 10;
}
最後,如果我們不介意number
在這個過程中搞砸的話,我們可以稍微簡化一下。
for (int n=0; n<16; ++n) {
numbers[n] = number % 10;
number /= 10;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句