目录
题目:
题目描述:
题目链接:
思路:
思路详解:
因为是填空题,并且数据范围最大为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;
}