具体题目要求:
小明发现了一个奇妙的数字。它的平方和立方正好把0~9的10个数字每个用且只用了一次。
你能猜出这个数字是多少吗?
解决办法:先确定范围是47-99之间 然后循环获取平方和立方的每一位,形成十位的数组,判断此数组是否正好包好0-9
优化方法:由于用取余数的方法获取每一位这里太麻烦,最好直接将数字转换成字符串。
后面的小难点在于判断构成的字符串是否正好是0-9,这里采用【寻数比对法】,也可以采用【冒泡排序法】,将字符串(对应的数字)从小到大排序,然后和数组{0,1,2,…9}按顺序比对。
//解决办法:先确定范围是47-99之间 然后循环获取平方和立方的每一位,形成十位的数组,判断此数组是否正好包好0-9
//优化方法:由于获取每一位这里太麻烦,最好直接将数字转换成字符串
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int i,x,y,m,n,k;
char X[4],Y[10];
for(i = 47;i < 100;i++)
{
k = 0; //清零操作
x = i * i; //x是4位
y = i * i * i;//y是6位
itoa(x,X,10);
itoa(y,Y,10);//分别将平方和立方转换成字符串
strcat(Y,X);//现在Y就是x和y的十位数字构成的字符串(合并)
//接下来任务就是验证Y里面是0-9,注意字符和数字的转换问题
for(m = 48;m < 58;m++)
for(n = 0; n < 10;n++)
if(m == (int)Y[n])//字符经过强制类型转换得到的是ascii码,
//故m取48-57 这个(int) 可以【省略】!
{
k++;
break;//这break不可无(避免重复数计入) 否则所有数都将输出
}
if(k == 10)
printf("%d",i);
}
return 0;
}
//最后输出结果是69
如果觉得一开始人为定47-99麻烦,也可以肆意地定到1-100,前面加一个判断,判断平方和立方共是10位再作下面的代码即可,如果不是10位就直接break。(数组长度要扩大些防止放不下)