题目描述:
如果整个整数X本身是完全平方数,同时它的每一位数字也都是完全平方数,我们就称X是完美平方数。
前几个完美平方数是 0、1、4、9、100、144…
请你计算第 2020 个完美平方数是多少?
第2020个完美平方数是491499994440019919104,这时i的值为22169799152
#include <iostream>
#include<math.h>
using namespace std;
long long arr[20];
int weishu(long long x);
void bx(long long arr[], int n);
void print1(long long arr[], int n);
void xc(long long x, long long arr[]);
bool shuz(long long arr[], int n);
bool pd(long long x);
long long shuzi(long long x);
int weishu(long long x)//得到一个数的位数
{
int n = 0;
long long temp = x;
do {
temp /= 10;
n++;
} while (temp > 0);
return n;
}
void bx(long long arr[], int n)//将数组中的每一个值都降到比十小
{
long long temp;
for (int i = 0; i < n; i++)
{
if (arr[i] >= 10)
{
temp = arr[i] % 10;
arr[i + 1] = arr[i] / 10 + arr[i + 1];
arr[i] = temp;
}
}
}
void print1(long long arr[], int n)//输出数组
{
int f = 0;
for (int i = n - 1; i >= 0; i--)
{
if (arr[i] != 0)
{
f = 1;
}
if (f == 0)
{
continue;
}
cout << arr[i];
}
}
void xc(long long x, long long arr[])//计算一个大数的平方,并存放在数组中
{
int n = 0;
long long a, b;
n = weishu(x);
for (int i = 0; i < n; i++)
{
a = x / (long long)pow(10, i) % 10;
arr[i] = a * x % 10 + arr[i];
b = a * x - a * x % 10;
arr[i + 1] = arr[i + 1] + b / 10;
}
}
bool wanmei(long long x)//判断一个数是否是完美平方数
{
int n = weishu(x);
bool f = true;
for (int i = 0; i < n; i++)
{
arr[i] = x / (long long)pow(10, n - 1 - i) % 10;
if (arr[i] != 0 && arr[i] != 1 && arr[i] != 4 && arr[i] != 9)
{
f = false;
break;
}
}
return f;
}
bool shuz(long long arr[], int n)//数存放在数组中,判断该数组是不是完美平方数
{
bool f = true;
for (int i = 0; i < n; i++)
{
if (!wanmei(arr[i]))
{
f = false;
break;
}
}
return f;
}
bool pd(long long x)//判断一个一位数是否是完美平方数
{
bool f = true;
if (x != 0 && x != 1 && x != 4 && x != 9)
{
f = false;
}
return f;
}
long long shuzi(long long x)//取到千位
{
long long n, sum;
n = x % 10000;
sum = n * n % 10000;
return sum;
}
int main()
{
int coun = 0;
for (long long i = 0;; i++)
{
long long brr[25] = { 0 };
if (i % 10 == 4 || i % 10 == 5 || i % 10 == 6)
{
continue;
}
if (!wanmei(shuzi(i)))//判断后四位是否满足条件
{
continue;
}
xc(i, brr);
bx(brr, 25);
if (shuz(brr, 25))
{
coun++;
print1(brr, 25);
cout << "第" << coun << "个" << endl;
}
if (coun == 2020)
{
break;
}
}
return 0;
}
用该方法是暴力求解,相对而言运行时间比较长
目前还有一种思路就是:
根据完美平方数的定义,完美平方数的每一位数字必然为 0 1 4 9,我们可以利用这四个数字进行排列组合,得到不同的数字,然后判断该数字是不是完全平方数