问题描述:排它平方数
小明正看着 203879 这个数字发呆。
原来,203879 * 203879 = 41566646641
这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。
具有这样特点的6位数还有一个,请你找出它!
再归纳一下筛选要求:
1. 6位正整数
2. 每个数位上的数字不同
3. 其平方数的每个数位不含原数字的任何组成数位
参考答案:639172
代码
//题目标题: 排它平方数
#include<iostream>
#include<climits>
using namespace std;
int main(){
//cout<<"INT_MAX: "<<INT_MAX<<endl;
// cout<<"long_MAX: "<<LONG_MAX<<endl;
// cout<<"LLONG_MAX: "<<LLONG_MAX<<endl;
// char s[6];
//注意除了a是从1开始,其他都是从0开始
for(int a=1;a<=9;a++)
for(int b=0;b<=9;b++)
for(int c=0;c<=9;c++)
for(int d=0;d<=9;d++)
for(int e=0;e<=9;e++)
for(int f=0;f<=9;f++)
{
if(a!=b&&a!=c&&a!=d&&a!=e&&a!=f&&b!=c&&b!=d&&b!=e&&b!=f&&c!=d&&c!=e&&c!=f&&d!=e&&d!=f&&e!=f){
bool flag = true;
long long num =a*100000+b*10000+c*1000+d*100+e*10+f;
// long num =a*100000+b*10000+c*1000+d*100+e*10+f;
long long sum = num*num;
// cout<<"sum是啥 "<<sum<<endl;
while(sum!=0){
long x=sum%10;
sum/=10;
if(x==a||x==b||x==c||x==d||x==e||x==f)
{
flag = false;
// break用处大,可以使其没用了早点跳出这个while循环
break;
}
}
if(flag)
{
// 这里的sum早就被前面改变了值,所以一直输出都是0
cout<<num<<"和"<<sum<<endl;
}
}
}
return 0;
}
代码参考:https://blog.csdn.net/daoshen1314/article/details/103329817
以上代码完全就是暴力解法,但是因为是填空题所以可以这么愚蠢地做。暴力解法虽然简单,但也要有需要注意的地方!!不然简单都不会
- 用long long存储
long num =a*100000+b*10000+c*1000+d*100+e*10+f; long long sum = num*num;
这样子其实会把sum的long long类型转换为long类型了- long long sum = 639172*639172;这样子还会把long long转换为int类型了,会溢出
- 将6位数先拆分6个位数的单个数进行计算,而不是从1一直计算到1000000
- 注意除了a是从1开始,其他都是从0开始,因为第一个数不能为0,其他数反而是不能忽略从0开始
- 求出sum之后,用while循环的求模,相除求出各个位数,判断是否有相同的地方则用if(x == a || x == b||x == c||x == d||x == e||x==f)
- 注意使用break和flag标志,有用处!
简化了一些
主要体现在check()函数,检查数字是否满足:其平方数的每个数位不含原数字的任何组成数位。主要涉及到stringstream和string的用法。
#include<iostream>
#include<climits>
#include<sstream>
//#include<string>
using namespace std;
bool check(long long x,long long xx){
string s_x,s_xx;
stringstream ss_x,ss_xx;
ss_x<<x;
ss_x>>s_x;
ss_xx<<xx;
ss_xx>>s_xx;
for(int i =0;i<s_x.length();i++){
if(s_xx.find(s_x[i])!=string::npos){
return false;
}
}
return true;
}
int main(){
//cout<<INT_MAX;//2147483647,INT_MAX跟LONG_MAX输出一样
//cout<<LLONG_MAX;//9223372036854775807
for(int i=1;i<10;i++)
for(int j =0;j<10;j++)
{
if(i!=j){
for(int k =0;k<10;k++)
if(i!=k&&j!=k){
for(int l =0;l<10;l++)
if(i!=l&&j!=l&&k!=l){
for(int m =0;m<10;m++)
if(i!=m&&j!=m&&k!=m&&l!=m){
for(int n =0;n<10;n++)
{
if(i!=n&&j!=n&&k!=n&&l!=n&&m!=n){
long long x = i*100000+j*10000+k*1000+l*100+m*10+n;
if(check(x,x*x))
{
cout<<x<<endl;
cout<<x*x<<endl;
}
}
}
}
}
}
}
}
return 0;
}