一、问题描述
二、问题分析
题目的问题描述看的有点懵,按照其做法反推,觉得应该是求其算平方根后,前10个数就包含所有0-9的最小的数,然后分包含整数的情况和只看小数部分的情况。
按照个人理解后进行实现就是将开方后的小数取一定的精度进行统计,看前10个数字是否符合要求。要点在于浮点数的格式化和字符统计。
三、代码实现
1.C/C++实现
#include <iostream>
using namespace std;
int main()
{
char* num = new char[21];
bool flag1 = false; // 包含整数部分
bool flag2 = false; // 只包含小数部分
for (int i = 2; !flag1 || !flag2; i++)
{
sprintf_s(num, 21 * sizeof(char), "%10.10f", sqrt(i));
if (!flag1)
{
string s = "";
for (int j = 0; j < 11 && num[j] != '\0'; j++)
{
if (num[j] == '.')
continue;
if (s.find(num[j]) == string::npos)
s += num[j];
else
break;
}
if (s.length() == 10)
{
flag1 = true;
cout << "包含整数:" << i << endl;
}
}
if (!flag2)
{
string s = "";
bool flag = false;
for (int j = 0; j < 21 && num[j] != '\0'; j++)
{
if (num[j] == '.')
{
flag = true;
continue;
}
if (flag && s.find(num[j]) == string::npos)
s += num[j];
else if (flag)
break;
}
if(s.length() == 10)
{
flag2 = true;
cout << "只包含小数:" << i << endl;
}
}
}
}
2.Python实现
# coding=utf-8
import math
if __name__ == '__main__':
i = 1
flag1 = False # 包含整数部分
flag2 = False # 只包含小数部分
while not flag1 or not flag2:
i += 1
s = ("%10.10f" % math.sqrt(i)).split('.')
if not flag1 and len(set(list(s[0] + s[1][:-len(s[0])]))) == 10:
flag1 = True
print("包含整数部分:", i)
if not flag2 and len(set(list(s[1]))) == 10:
flag2 = True
print("只包含小数部分:", i)