一、这道题很容易理解,题中所说的和7有关的数字有两种情况,一种是7的倍数,如(14,21,42)。另一种含有7的数字,如(7,17,27,71)。第一种情况很好解决 i%7==0 就可以解决,第二种情况我的原始想法是从个位开始检查,一直检查到万位,用的是if else,但是这个不是万能的逻辑,因为如果上升到的数字超过万位,代码还需要加if else,这不是万全之策。先看下这段悠长的代码。

```#include<iostream>
using namespace std;
int main(void){
    int n=0,i=0,m=0;
    while(cin>>n){
        m=0;
        for(i=7;i<=n;i++){
            if(i%7==0){
                m++;
               continue;
            }else if( i/100==0){ /*两位数*/
                if(i%10==7){
                    m++;
                    continue;
                }
                if(i%100-i%10==70){
                    m++;
                    continue;
                }
            }else if( i/1000==0){/*三位数*/
                if(i/100==7){
                    m++;
                    continue;
                }
                if(i%10==7){
                    m++;
                    continue;
                }
                if(i%100-i%10==70){
                    m++;
                    continue;
                }
            }else if( i/10000==0) { /*四位数*/
                 if(i/1000==7){
                    m++;
                    continue;
                }
                if(i%10==7){
                    m++;
                    continue;
                }
                if(i%100-i%10==70){
                    m++;
                   
                    continue;
                }
                if(i%1000-i%100==700){
                    m++;
                    continue;
                }
            }else{ /*五位数*/
                if(i%10==7){
                    m++;
                    continue;
                }
                if(i%100-i%10==70){
                    m++;
                    continue;
                }
                if(i%1000-i%100==700){
                    m++;
                    continue;
                }
                 if(i%10000-i%1000==7000){
                    m++;         
                    continue;
                }

            }
        }
        cout<<m<<endl;
    }
    return 0;
}

通过上边的代码不难看出其中蕴藏的递归算法,每一if 里都有着相同的代码逻辑,那么是不是可以用递归处理呢?答案是没问题的

using namespace std;
int check7(int i){
    if(i%10==7)
        return 1;
    i=i/10;
    if(i==0)
        return 0;
   return check7(i);
}
int main(void){
    int n=0,i=0,m=0;
    while(cin>>n){
        m=0;
        for(i=7;i<=n;i++){
            if(i%7==0){
                m++;
               continue;
            }else {
                if(check7(i)==1)
                    m++;
            }
        }
        cout<<m<<endl;
    }
    return 0;
}

还有一种解决办法,这就需要C++的string容器了,把int转换成string,然后用string 自带的find检查字符串是否有7。这种办法很好理解。

#include<cstring>
using namespace std;

int main(void){
    int n=0,i=0,m=0;
    string str;
    string::size_type pos;
    while(cin>>n){
        m=0;
        for(i=7;i<=n;i++){
            if(i%7==0){
                m++;
               continue;
            }else {
                   str=to_string(i);
                   pos=str.find('7');
                   if(pos!=str.npos)
                    m++;
            }
        }
        cout<<m<<endl;
    }
    return 0;
}