C的新人;在for循环中使用pow()

时间:2018-04-27 16:40:16

标签: c for-loop cs50 pow

我正在尝试通过edX / iTunesU在哈佛的CS50课程中学习pset1,我正在尝试编程Luhn's algorithm。以下代码非常不完整,但我想知道如何在for循环中使用pow()并在i中使用pow()。据推测,还有另一种方法可以在不使用pow()的情况下对Luhn的算法进行编程,但是探索这种方法已经引起了我的注意。有什么建议吗?

#include <stdio.h>
#include <cs50.h>
#include <math.h>

int main(void) {
    long long c = 1234123412341234;
    long long temp_c = c;
    long long temp_c_one = c;
    long long c_one_x = 0;
    int count = 0;

    while (temp_c > 0LL) {
        temp_c = temp_c / 10LL;
        count++;
    }

    for (int i = 0; i < count; i++) {
        c_one_x = (temp_c_one % (pow(10, (i + 1))) / (pow(10, i));
        count--;
    }
}

1 个答案:

答案 0 :(得分:2)

你可以通过一个计数器来避免使用pow,你可以在每次循环迭代时乘以10。

#include <stdio.h>
#include <cs50.h>
#include <math.h>

int main(void) {

  long long c = 1234123412341234;
  long long temp_c = c;
  long long temp_c_one = c;
  long long c_one_x = 0;

  long long pwr = 1; // 10^0 = 1
  int count = 0;

  while (temp_c > 0LL) {
    temp_c = temp_c / 10LL;
    count++;
  }

  // TODO: Don't think you should decrement count in this loop
  for (int i = 0; i < count; i++) {
    c_one_x = (temp_c_one % (pwr * 10)) / pwr;
    count--;
    pwr *= 10;
  }
}

然而,我不相信你已经制作了一个很好的Luhns算法实现,所以我的建议是:

// Better Luhn's algorithm
int luhn( long long cc) {
  unsigned long check = 0;
  unsigned int digit;
  for (int i = 0; cc > 0; i++) {
    digit = cc % 10;
    // double every second digit
    if (i % 2) {
      digit *= 2;
      digit = (digit >= 10) ? (digit + 1) % 10 : digit;
    } 
    check += digit; 
    cc = cc/10; // next CC digit.
  }
  return check;
}

int main (void) {
  long long c = 1234123412341234;

  print "Result is : %d", luhn(c));
}