c - 无法理解循环中的值如何工作

标签 c cs50

我尝试在week2之后为cs50 pset1的问题编写代码:credit.c(更舒服)。我的代码如下。问题是“sumx”和“sumy”只是 0,因此“sum”始终等于 0。因此,每当我给出正确的信用卡号时,它都会转到新行,程序结束。我该如何解决这个问题?为什么“sumx”和“sumy”没有按照算法计算得出各自的总和?

我的代码是:

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

int main(void){

  long long i;
  do{
    printf("Your credit card number:\n");   
    i = get_long_long();
  }
  while(i < 4e12 || i > 5.5e15);
  int count = 0;
  int n;
  long long c = i;

  while(i != 0){
    n = i%10;
    i = i/10;
    count++;
  }
  int x[count];

  for(int j = 0; j < count; j++){
    x[j] = c%10;
    i = c/10;
  }

  int sumx = 0;

  for(int j = 0; j < count - 1; j += 2){
    x[j] = x[j] * 2;
    sumx = sumx + x[j];
    printf("%i", sumx);
  }

  int sumy = 0;

  for(int j = 0; j < count; j += 2){
    sumy = sumy + x[j];
  }  

  int sum;
  sum = sumx + sumy;

  if(sum%10 == 0){
    if((count == 15 && x[14] == 3) && (x[13] == 4 || x[13] == 7)){
        printf("AmEx\n");
    }
    else if((count == 16 && x[15] == 5) && (x[14] > 1 || x[14] < 5)){
        printf("MASTERCARD\n");
    }
    else if((count == 13 && x[12] == 4) || (count == 16 && x[15] == 4)){
        printf("VISA\n");
    }
  }
  else{
    printf("Invalid Number\n");
  }

  return 0;
  }

最佳答案

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

int main(void){

  long long i=4111111111111111;
  //Master: 5105105105105100;//16
  //visa: 4111111111111111
  printf("%lld\n",i);

  //~ do{
    //~ printf("Your credit card number:\n");   
    //~ i = get_long_long();
  //~ }
  //~ while(i < 4e12 || i > 5.5e15);


  int count = 0;
  long long c = i;
  int k=0;
  int x[100];//

  while(c != 0){
    x[k] = c%10;
    c = c/10;
    printf("%lld\n",c);
    count++;
    k++;
  }

  //k==count
  printf("count:%d\n",count);
  printf("k:%d\n",k);

    // x[i] contains all the digits of credit card
    printf("print x[i]\n");
    for (int i=0;i<count;i++){
        printf("%d ",x[i]);
    }

    printf("\n");


    int addsum=0,x2prod=0;

     for (int j=0; j<k; j+=2 ){
        addsum += x[j];
    }   

 printf("addsum:%d\n",addsum);



    for (int j=1; j<k; j+=2 ){
        if ( (2 * x[j]) > 9 ){ //have 2 digit
            x2prod += (2 * x[j]) / 10;
            x2prod += (2 * x[j]) % 10;
        }
        else // have one digit
            x2prod += 2 * x[j];
    }   


    printf("x2prod:%d\n",x2prod);

    int sum; 

    sum = addsum + x2prod;


  printf("\nsum: %d\n",sum);

  if(sum%10 == 0){
    if((count == 15 && x[14] == 3) && (x[13] == 4 || x[13] == 7)){
        printf("AmEx\n");
    }
    else if((count == 16 && x[15] == 5) && (x[14] > 1 || x[14] < 5)){
        printf("MASTERCARD\n");
    }
    else if((count == 13 && x[12] == 4) || (count == 16 && x[15] == 4)){
        printf("VISA\n");
    }
  }
  else{
    printf("Invalid Number\n");
  }

  return 0;
  }

我对您的代码进行了一些更正,将所有信用卡数字存储在第一个 while()x[] 数组中。

我仅使用三个示例检查了代码输出,顺便说一句,这不是一个可靠的版本,请 try catch 任何错误。

当您阅读我的评论时,我对此一无所知,但通过执行简单搜索此 link

告诉我该怎么做并按照你的方式解码它。

关于c - 无法理解循环中的值如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44733240/

相关文章:

c - 如何在C中连接2个字符串。其中一种具有某种垃圾值(value)

c - 将 3 个字节拆分为六个 4 位并重新组合为两个 12 位

c - 关系比较结果C中for()循环的未使用错误

c - 根据输入执行一段代码

java - 有没有办法只显示过滤后的结果?

c++ - 如何使用 MPI 收集行和列分区矩阵?

C:创建一个结构,返回一个类型

c - 多字符字符常量 [-Werror,-Wmultichar]

c - 为什么我的 C 程序在使用 floor 和 ceil 以及舍入函数时意外终止?

c - 为什么这会导致段错误?