第十四届蓝桥杯 2023 C/C++组 幸运数

目录

题目:

题目描述:

题目链接:

思路:

思路详解:

代码:

代码详解:


题目:

题目描述:

题目链接:

蓝桥云课 幸运数

思路:

思路详解:

因为是填空题,并且数据范围最大为1e8,单纯一层for循环遍历的话还是可以接受的,实际上跑程序的时候也就是等个几秒就出结果了

思路就是遍历从1到10000000的每一个数,处理每一个数是先计算这个数的位数是几,如果位数是奇数就直接跳过。如果是偶数就分成两部分来求,前半部分把每一位单独切出来求和,后半部分也是把每一位切出来求和,然后判断前半部分数位之和是否等于后半部分数位之和即可

代码:

代码详解:

#include<bits/stdc++.h>
using namespace std;

int main()
{
	int ans=0;
	for(int i=1;i<=1e8;i++) //1e8表示10^8,由于数据比较大,出结果可能要等个几秒 
	{
		int count=0;        //注意count,left,right这三个变量每次遍历下一个数要初始化 
		int left=0;         //一开始把这三个变量定义放在了for循环外,结果都是输出0 
		int right=0;        //因为上一次遍历的结果没初始化就会进入下一次遍历 
		int temp1=i;        //这里定义临时变量temp1,否则在下面删最后一位时,i会变为0 
		while(temp1!=0)
		{
			temp1/=10;      //删去temp1的最后一位 
			count++;        //每删去一位,位数count加1 
		}
		if(count%2==0)      //判断该数位数是不是偶数 
		{
			int temp2=i;    //上面的temp1最后变成0,再定义一个临时变量temp2 
	        for(int j=1;j<=count/2;j++)  //通过切位数的一半,再分别求左右半边的和 
	        {
	        	right+=temp2%10;
	        	temp2/=10;
			}
			for(int j=1;j<=count/2;j++)
			{
				left+=temp2%10;
				temp2/=10;
			}
			if(left==right)  //判断左右半边各个位数和是否相等 
			{
				ans++;
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值