因为前后数组合是一样的,所以只需要算前半部分就可以了
1-100000000范围内,1和100000000排除,所以最大为9999 9999
位数是变化的,这几位数之和也是变化的,因为是偶数位,我们前后位数就一样
巧妙之处:
(1)可以定义一个数组,来存放相应位数相应和之下的数字组合情况有几种
(2)偶数位如何保证,就是让前后位数相等即可
前面位数一定大于等于后面位数,当后面位数小于前面位数的时候,可以补0让其相等
........作为一个填空题这个思路属实不好想.........也可能是我太菜了吧..........
#include <iostream>
using namespace std;
int a[5][50];
//第一位表示一个数的位数,第二维表示这个位数所有可能的和,数组里存的是在这个位数下和为*的数的组合到底有多少个
void gets(int x){
int sum=0;
int num=0;
while(x){
sum+=x%10;
num++;//*******************x的位数就是看x能除以几次10
x=x/10;
}
a[num][sum]++;
}
int main()
{
int res=0;
for(int i=1;i<=9999;i++)//一个数前后是对称的只需要算一半就可以了
gets(i);
for(int i=1;i<=4;i++)//先枚举位数
for(int j=1;j<=i*9;j++)//枚举确定位数情况下,数之和的范围
//根据前半部分位数确定后半部分位数
for(int k=1;k<=i;k++)//不直接k=i的原因是,k的位数不够的话和前半部分不一样,它前面可以加0来凑,这样整体的数前后位数还是一样的
res+=a[i][j]*a[k][j];//前后能组合的种类数需要相乘
cout<<res<<endl;
return 0;
}