【无标题】

本文介绍了一个编程问题,要求在给定整数区间[a,b]内找出所有满足奇数位和偶数位之和相等的幸运数字,并提供了一段C++代码实现,通过暴力枚举和数位处理优化了时间复杂度。
摘要由CSDN通过智能技术生成

A. 幸运数字

题目描述

如果把一个数字十进制表示的奇数位和偶数位分别相加得到的和相同,小小就认为它是一个幸运的数字。例如:

  • 12345 奇数位相加 1 + 3 + 5 = 9、偶数位相加 2 + 4 = 6,因此 12345 不是幸运数字;
  • 2332 奇数位相加 2 + 3 = 5、偶数位相加 3 + 2 = 5,因此 2332 是幸运数字。

对于给定的 a 和 b,小小希望你求出 a, a + 1, a + 2, …, b 中幸运数字的数量。

输入格式

输入数据仅一行,包含空格分隔的两个整数 a 和 b。

输出格式

输出一行一个整数,代表 a, a + 1, a + 2, …, b 中幸运数字的数量。

样例

样例输入 1

复制1 100

样例输出 1

复制9

样例输入 2

复制4096 65536

样例输出 2

复制3454
数据范围与提示
  • 对于 100% 的数据,满足 1 ≤ a ≤ b ≤ 1, 000, 000。

思路

首先观察一下数据,a<=b<=1'000'000。

假设以暴力的思想解决,枚举a到b需要写一重1'000'000的循环,每一个数字最多有7位,判断是否是“幸运数字”需要7次,所以总复杂度(O)就是1'000'000 * 7 * 7 = 49'000'000,不超时。

以下是代码:

#include <bits/stdc++.h>
using namespace std;
int a,b;
int sum=0;
int c[8];//记录数位
int s=0;
void deal(int sum){
	int i=0;
	while(sum>0){
		i++;
		c[i]=sum%10;
		sum/=10;
	}
	s=i;
	return ;
}
bool judge(){
	int suma,sumb;
	suma=sumb=0;
	for(int i=1;i<=s;i++){
		if(i%2==1){
			suma+=c[i];
		}
		else{
			sumb+=c[i];
		}
	}
	if(suma==sumb){
		return true;
	}
	return false;
}
int main(){
	cin>>a>>b;
	for(int i=a;i<=b;i++){
		s=0;
        memset(c,0,sizeof(c));
        deal(i);
		if(judge()){
			sum++;
		}
	}
	cout<<sum<<endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值