c++

葡萄const 2021-02-12 07:39:06
金融:信用卡号码校验 不会利用这些函数,来做这道题,对字符串不是很理解,想知道这个题怎么做
...全文
110 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
葡萄const 2021-02-14
  • 打赏
  • 举报
回复
引用 9 楼 qzjhjxj的回复:
两个bool函数可以再简化点,如下,供参考:
#include <iostream>
#include <string>
using namespace std;
int sumOfOddPlace(const string& cardNumber)
{
    int sum=0;
    for(int i=cardNumber.size()-1,j=0;i>=0;i--){
        if(++j%2==1)                  //奇位数
           sum+=cardNumber.at(i)-'0';
    }
    return sum;
}

int getDigit(int number)
{
    int sum=0;
    while(sum+=number%10,number)number/=10;
    return sum;
}

int sumOfDoublePlace(const string& cardNumber)
{
    int sum=0;
    for(int i=cardNumber.size()-1,j=0;i>=0;i--){
        if(++j%2==0)                     //偶位数
           sum+=getDigit((cardNumber.at(i)-'0')*2);
    }
    return sum;
}

bool startsWith(const string& cardNumber)
{
   if(cardNumber.size()>=13 && cardNumber.size()<=16)
      if(cardNumber.at(0)=='4'||cardNumber.at(0)=='5'||
         cardNumber.at(0)=='6'||(cardNumber.at(0)=='3'&&cardNumber.at(1)=='7'))
            return true;
   return false;
}

bool isValid(const string& cardNumber)
{
    if(startsWith(cardNumber))
       if((sumOfDoublePlace(cardNumber)+sumOfOddPlace(cardNumber))%10==0)
                return true;
    return false;
}



int main()
{
    string str;
    cin>>str;

    if(isValid(str))
       cout<<"Is Valid card!"<<endl;
    else
       cout<<"Is Invalid card!"<<endl;
    
    return 0;
}
好哒,谢谢你哦,赞赞
qzjhjxj 2021-02-14
  • 打赏
  • 举报
回复
两个bool函数可以再简化点,如下,供参考:
#include <iostream>
#include <string>
using namespace std;
int sumOfOddPlace(const string& cardNumber)
{
    int sum=0;
    for(int i=cardNumber.size()-1,j=0;i>=0;i--){
        if(++j%2==1)                  //奇位数
           sum+=cardNumber.at(i)-'0';
    }
    return sum;
}

int getDigit(int number)
{
    int sum=0;
    while(sum+=number%10,number)number/=10;
    return sum;
}

int sumOfDoublePlace(const string& cardNumber)
{
    int sum=0;
    for(int i=cardNumber.size()-1,j=0;i>=0;i--){
        if(++j%2==0)                     //偶位数
           sum+=getDigit((cardNumber.at(i)-'0')*2);
    }
    return sum;
}

bool startsWith(const string& cardNumber)
{
   if(cardNumber.size()>=13 && cardNumber.size()<=16)
      if(cardNumber.at(0)=='4'||cardNumber.at(0)=='5'||
         cardNumber.at(0)=='6'||(cardNumber.at(0)=='3'&&cardNumber.at(1)=='7'))
            return true;
   return false;
}

bool isValid(const string& cardNumber)
{
    if(startsWith(cardNumber))
       if((sumOfDoublePlace(cardNumber)+sumOfOddPlace(cardNumber))%10==0)
                return true;
    return false;
}



int main()
{
    string str;
    cin>>str;

    if(isValid(str))
       cout<<"Is Valid card!"<<endl;
    else
       cout<<"Is Invalid card!"<<endl;
    
    return 0;
}
葡萄const 2021-02-14
  • 打赏
  • 举报
回复
引用 7 楼 qzjhjxj的回复:
修改楼主的,供参考:
#include <iostream>
#include <string>
using namespace std;
int sumOfOddPlace(const string& cardNumber)
{
    int sum=0;
    for(int i=cardNumber.size()-1,j=0;i>=0;i--){
        if(++j%2==1)                  //奇数位
           sum+=cardNumber.at(i)-'0';
    }
    return sum;
}

int getDigit(int number)
{
    int sum=0;
    while(sum+=number%10,number)number/=10;
    return sum;
}

int sumOfDoublePlace(const string& cardNumber)
{
    int sum=0;
    for(int i=cardNumber.size()-1,j=0;i>=0;i--){
        if(++j%2==0)                     //偶数位
           sum+=getDigit((cardNumber.at(i)-'0')*2);
    }
    return sum;
}

bool startsWith(const string& cardNumber)
{
   if(cardNumber.size()>=13 && cardNumber.size()<=16)
      if(cardNumber.at(0)=='4'||cardNumber.at(0)=='5'||
         cardNumber.at(0)=='6'||(cardNumber.at(0)=='3'&&cardNumber.at(1)=='7'))
            return true;
      else
            return false;
   else
      return false;
}

bool isValid(const string& cardNumber)
{
    if(startsWith(cardNumber))
       if((sumOfDoublePlace(cardNumber)+sumOfOddPlace(cardNumber))%10==0)
                return true;
       else
                return false;
    else
       return false;

}



int main()
{
    string str;
    cin>>str;

    if(isValid(str))
       cout<<"Is Valid card!"<<endl;
    else
       cout<<"Is Invalid card!"<<endl;
  
    return 0;
}
哇哦,好哒,谢谢你哦
葡萄const 2021-02-13
  • 打赏
  • 举报
回复
用布尔型变量判断开头的时候,我删减了一个形参,这个我是真心不知道,怎么利用substr
葡萄const 2021-02-13
  • 打赏
  • 举报
回复
#include <iostream> #include <string> using namespace std; int sumOfOddPlace(const string& cardNumber) { int sum=0; for(int i=cardNumber.size()-1;i>=0;i--) { int j=i+1; if(j%2==0) sum+=cardNumber.at(i)-48; } return sum; } int getDigit(int number) { string str=""+number; int sum=0; if(str.size()==1) { return number; } else { number=number%10+number/10; return number; } } int sumOfDoublePlace(const string& cardNumber) { int sum=0; for(int i=cardNumber.size()-1;i>=0;i--) { int j=i+1; if(j%2==1) { sum+=getDigit((cardNumber.at(i)-48)*2); } } return sum; } bool isValid(const string& cardNumber) { if(cardNumber.size()>=13&&cardNumber.size()<=16) return true; else return false; } bool startsWith(const string& cardNumber) { int a=cardNumber.at(0)-48; int b=cardNumber.at(1)-48; if(a==4||a==5||a==6) return true; else if(a==3&&b==7) return true; else return false; } int main() { string str; cin>>str; if(!isValid(str)) cout<<"error"<<endl; else if(!startsWith(str)) cout<<"error"<<endl; else { if((sumOfDoublePlace(str)+sumOfOddPlace(str))%10==0) cout<<"Success!"<<endl; else cout<<"error"<<endl; } return 0; }
葡萄const 2021-02-13
  • 打赏
  • 举报
回复
现在基本写出来了,但是我删减了一个形式参数
宇来风满楼 2021-02-13
  • 打赏
  • 举报
回复
引用 1 楼 葡萄const的回复:
其实我最想知道的,就是,getDigit这个函数,是做什么的,说返回这个数字,如果是单一的,否则就是两个数字的和,这是要把,上一个函数再写一遍么
不知道就搜索呗
qzjhjxj 2021-02-13
  • 打赏
  • 举报
回复
修改楼主的,供参考:
#include <iostream>
#include <string>
using namespace std;
int sumOfOddPlace(const string& cardNumber)
{
    int sum=0;
    for(int i=cardNumber.size()-1,j=0;i>=0;i--){
        if(++j%2==1)                  //奇数位
           sum+=cardNumber.at(i)-'0';
    }
    return sum;
}

int getDigit(int number)
{
    int sum=0;
    while(sum+=number%10,number)number/=10;
    return sum;
}

int sumOfDoublePlace(const string& cardNumber)
{
    int sum=0;
    for(int i=cardNumber.size()-1,j=0;i>=0;i--){
        if(++j%2==0)                     //偶数位
           sum+=getDigit((cardNumber.at(i)-'0')*2);
    }
    return sum;
}

bool startsWith(const string& cardNumber)
{
   if(cardNumber.size()>=13 && cardNumber.size()<=16)
      if(cardNumber.at(0)=='4'||cardNumber.at(0)=='5'||
         cardNumber.at(0)=='6'||(cardNumber.at(0)=='3'&&cardNumber.at(1)=='7'))
            return true;
      else
            return false;
   else
      return false;
}

bool isValid(const string& cardNumber)
{
    if(startsWith(cardNumber))
       if((sumOfDoublePlace(cardNumber)+sumOfOddPlace(cardNumber))%10==0)
                return true;
       else
                return false;
    else
       return false;

}



int main()
{
    string str;
    cin>>str;

    if(isValid(str))
       cout<<"Is Valid card!"<<endl;
    else
       cout<<"Is Invalid card!"<<endl;
  
    return 0;
}
forever74 2021-02-12
  • 打赏
  • 举报
回复
题意是上一个函数通过多次调用这个函数来完成任务。 所以不要看到一句要求就开始写代码,要把题目看完。
葡萄const 2021-02-12
  • 打赏
  • 举报
回复
其实我最想知道的,就是,getDigit这个函数,是做什么的,说返回这个数字,如果是单一的,否则就是两个数字的和,这是要把,上一个函数再写一遍么

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧