2016-07-28 4 views
1
static void Main(string[] args) 
{ 
    int num = 382; 
    int output = 0; 
    char[] nlst = num.ToString().ToCharArray(); 
    for (int i = 0; i < nlst.Length; i++) 
    { 
     output += nlst[i]; 
    } 
    Console.WriteLine(output); 
    Console.ReadLine(); 
} 

В результате выход 157, На самом деле это должно быть 13.With Dedbugging я нашел 3 элементы полукокса [], как это NLST:INT в массив символов

[0] 51'3' , [1] 56'8 ', [2] 50'2'

Почему? В чем смысл 51,56,50?

+1

Unicode code points? Чего вы пытаетесь достичь именно? –

+0

51,56,50 - это коды asci для 3,8,2. Вы разделяете строку на отдельные символы. – BWA

+0

@BWA, ASCII - это последнее тысячелетие ... –

ответ

8

Вы считаете, что значение char '0' равно 0. Это не так; это на самом деле значение UTF16 из '0' которое 48.

Таким образом, вы сложением значения utf16 персонажей '3', '8' и '2', то есть 51, 56 и 50.

Обратите внимание, что если ваша цель чтобы сложить все цифры целого, лучший подход, чтобы избежать преобразования в строку полностью, например, так:

int num = 382; 

// Compute the sum of digits of num 

int total = 0; 

while (num > 0) 
{ 
    total += num%10; 
    num /= 10; 
} 

Console.WriteLine(total); 

Однако, если вы просто хотите знать, как получить версию работает, просто вычесть '0' от каждого символа до добавления трески вместе. Это будет конвертировать '0' 0, '1' до 1, и т.д.:

for (int i = 0; i < nlst.Length; i++) 
{ 
    output += nlst[i] - '0'; // Subtract '0' here. 
} 
1

Те значения Unicode для '3', '8' и '2' соответственно.

Чтобы преобразовать значение Unicode (например, 51) в целочисленное представление символа, представленного значением Unicode (например, 3), используйте метод Convert.ToInt32(char).

0

[EDITED] Char is unicode 16 (https://msdn.microsoft.com/en-us/library/x9h8tsay.aspx). Вы можете использовать int.Parse

static void Main(string[] args) 
{ 
    int num = 382; 
    int output = 0; 
    char[] nlst = num.ToString().ToCharArray(); 
    for (int i = 0; i < nlst.Length; i++) 
    { 
     output += int.Parse(nlst[i].ToString()); 

    } 
    Console.WriteLine(output); 
    Console.ReadLine(); 
} 
0

Эти цифры являются кодами номеров. Если вы просто хотите, чтобы сложить значение каждой цифры, вы можете вычесть 48 из каждого значения полукокса, чтобы превратить его в ист значение числа

for (int i = 0; i < nlst.Length; i++) 
{ 
    output += nlst[i] - 48; 
} 
0

Ваша выходная переменная определяется как целое число. Если вы добавите (+ =) символ в целое число, это значение unicode будет добавлено к выходной переменной.

static void Main(string[] args) 
{ 
    int num = 382; 
    int output = 0; 
    char[] nlst = num.ToString().ToCharArray(); 
    for (int i = 0; i < nlst.Length; i++) 
    { 
     output += Convert.ToInt32(nlst[i]); 

    } 
    Console.WriteLine(output); 
    Console.ReadLine(); 
} 
0

Вы должны преобразовать char обратно в числовое значение.

Попробуйте это:

output += Convert.ToInt32(Char.GetNumericValue(nlst[i])); 
0

Правильное решение

output += Convert.ToInt32(nlst[i]) - '0'; 

или кратко

output += nlst[i] - '0'; 

или, как альтернатива

output += Convert.ToInt32(Convert.ToString(nlst[i])); 

Обратите внимание: как и C++, конвертировать C#.ToInt32 преобразует символы в базовый Unicode (то есть старый добрый Ascii).

Смежные вопросы