2016-10-09 7 views
0

я был дан алгоритм случайной контрольной суммы, которое работает таким образомсвоп первое число со вторым, второй с третьим и так далее

  1. ввести номер (до 1 000 000)
  2. алгоритм п [ 0] -n [1] + n [2] -n [3], так что это просто добавление и вычитание частей числа. Если число равно 1243, то 1-2 + 4-3 = 0.

Если результат равен 0, тогда контрольная сумма прошла. Если нет, мне нужно поменять номера: сначала со вторым, затем попробуйте, если не получится, второй с третьим, затем попробуйте и так далее. Так что для 224 это дало бы мне 0, заменив второй 2 и 4.

Пока мой код:

#include <stdio.h> 
#include <stdlib.h> 

    int intlen (long long n) 
    { 
    int len = 1; 
    while (abs (n) > 9) 
    { 
     n /= 10; 
     ++len; 
    } 
    return len; 
} 
short getDigit (long long num, int index) 
{ 
    int pos = intlen (num) - index; 
    while (pos > 1) 
    { 
     num /= 10; 
     --pos; 
} 
    if(intlen(num) <= index) { 
     return 0; 
    } 
    return num % 10; 
} 
int checkSum(int pin) { 
    int wynik = 0; 
    int typ = 0; 
    int i = 0; 
    for(i = 0; i < intlen(pin); i=i+3) { 
     if(typ == 0) { 
      wynik += getDigit(pin, i) - getDigit(pin, i+1) + getDigit(pin, i+2); 
      typ = 1; 
     } else { 
      wynik -= getDigit(pin, i) - getDigit(pin, i+1) + getDigit(pin, i+2); 
      typ = 0; 
     } 
    } 
    return wynik; 
} 
int main() 
{ 
    int wynik, pin; 
    scanf("%d", &pin); 
    wynik = checkSum(pin); 
    printf("CS: %d\n", wynik); 
    system("pause"); 
    return 0; 
} 

Но я не знаю о том, как сделать подкачку часть. Может ли кто-нибудь просветить меня, как это сделать?

+0

Выясните, какая цифра больше. Вычтите разницу (между '0' и' 9') с большей цифры и добавьте ее к младшей цифре. Но я бы предложил загрузить ваш номер в массив, чтобы упростить обмен. – Charles

+0

Весь код будет проще, если бы это был массив ... –

ответ

0

Может быть, я не понимаю, что вы хотите сделать, но если я правильно понимаю, что это все, что вам нужно:

#include <stdio.h> 
#include <string.h> 

int checkSum(char pin[]) 
{ 
    int wynik = 0; 
    int sub = 0; 
    int i = 0; 

    for (i = 0; i < strlen(pin); i++, sub=!sub) 
    { 
     // use pin[I] - '0' to get the number stored in the array location 
     // use sub?-1:1 * X to either subtract or add by multiplying by -1 
     wynik = wynik + (sub?-1:1) * (pin[i]-'0'); 
    } 

    return wynik; 
} 

int main() 
{ 
    char pin[8]; // enough to hold 1000000\0 
    int wynik; 
    int swap; 
    int i=0; 

    puts("Enter pin:"); 
    scanf("%s", &pin); 

    // update checksum 
    wynik = checkSum(pin); 
    printf("PIN=%s CS=%d\n", pin,wynik); 

    for (i = 0; wynik != 0 && i < strlen(pin) - 1; i++) 
    { 
     // swap pin[i] with pin[i+1] 
     swap = pin[i]; pin[i] = pin[i+1]; pin[i+1] = swap; 

     // update checksum 
     wynik = checkSum(pin); 
     printf("PIN=%s CS=%d\n", pin,wynik); 
    } 
} 

Все это будет проще, если вы используете массив и строка является массив символов, что почти идеально - единственное, что вам нужно сделать, чтобы получить цифру в каком-либо индексе массива, вычитает «0» из значения в этом индексе. Причина этого в том, что символы от 0 'до' 9 'смежны. Это означает, что вам не нужны getDigit(), а intlen() можно заменить на strlen()

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

  • Нет связанных вопросов^_^