一、这道题很容易理解,题中所说的和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;
}