幸运数

// 给出两个整数: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;
}

运行结果示例:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值