交换第一个数字与第二个,第二个交换第三个等等

时间:2016-10-09 23:19:24

标签: c swap

我得到了一种随机校验和算法,这种算法就是这样的

  1. 输入数字(最多1 000 000)
  2. 算法是n [0] -n [1] + n [2] -n [3]所以它​​只是加上和减去数字的一部分。如果数字是1243,那么1-2 + 4-3 = 0。
  3. 如果结果为0,则校验和通过。如果没有,我需要交换数字:首先是第二个,然后尝试,如果不起作用,第二个与第三个,然后尝试等等。所以对于224,它会通过替换第二个和第二个来给我0。

    到目前为止,我的代码是:

    #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;  
    }  
    

    但我真的不知道如何进行交换部分。有人可以告诉我如何做到这一点吗?

1 个答案:

答案 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()

相关问题