// 给出两个整数:a,b。1 <= a <= 9 ; 1 <= b <= 9 ;
// 若正整数n同时满足以下两个条件,则称n为幸运数
// 条件1:n只由a或者b组成
// 条件2:n的各个位之和也是由a或者b组成
// 例如,对于a=1、b=2,则11为幸运数,111不是幸运数,因为1+1+1=3。
// 在闭区间[1,(10^k)-1]内寻找满足条件的幸运数,并求出总的个数
#include<iostream>
#include<math.h>
using namespace std;
int main(){
int a,b,k; // k表示k位数
cin >> a >> b >> k;
int sum = 0;
int weizu[20]; // 存储各个位
int temp[20]; // 存储各个位的和的各个位
int indexwei = 0; // 位索引
int indexb = 0; // 位的和的位的索引
int weihe = 0; // 位的和
int shifou1 = 0; // 判断条件1:各个位不含有除了a和b以外的数
int shifou2 = 0; // 判断条件2:各个位的和的各个位不含有除了a和b以外的数
for(int i = 1 ; i <= pow(10,k)-1 ; i ++){
const int ii = i;
while(i){ // 将i的各个位存入数组weizu[],并计算位和weihe
weizu[indexwei] = i%10;
weihe += weizu[indexwei];
i /= 10;
indexwei ++;
} // 注意:此处的while循环结束后,i的值为0
for(int v = 0 ; v < indexwei ; v ++){ // 判断条件1
if((weizu[v] != a) && (weizu[v] != b)){
shifou1 ++;
}
}
while(weihe){ // 将位和的各个位存入数组temp[]
temp[indexb] = weihe%10;
weihe /= 10;
indexb ++;
}
for(int u = 0 ; u < indexb ; u ++){ // 判断条件2
if((temp[u] != a) && (temp[u] != b)){
shifou2 ++;
}
}
i = ii; // i的值复原
if(shifou1 == 0 && shifou2 == 0){ // 条件1和条件2必须同时满足
cout << i << endl;
sum ++; // 满足条件的数的总的个数
}
indexwei = 0; // 清零
indexb = 0; // 清零
weihe = 0; // 清零
shifou1 = 0; // 清零
shifou2 = 0; // 清零
}
cout << "Total:" << sum << endl;
return 0;
}
运行结果示例: