题目大意:给定一个进制,找到1到300之间,在此进制下自己为回文自己的平方同样为回文的数字,从小到大输出自己(空格)自己的平方
通过这道题复习:
1:练习函数的使用
2:递归的思考方式
3:再次复习文件操作
使用到的函数:
int pal(int* a,int len):判断是否为回文,将进制数组作为参数返回真假,第二个是长度,其实这里还可以用字符串省去这个参数,或者把长度放在a[0]里,但不想写,又是一个需要用全局变量的地方,要是不是全局变量这个长度我还没有办法传递到上一层,等看完CPP的函数那一章不知道能不能找到好的操作;
int bass(int ) :进制转换,将一个int类型的数字转化为相应进制,并输出;
注:进制要定义为全局变量
伪代:
主函数
{
输入进制
for(i=1~300)
{
if (pal(i*i))
bass(i);
bass(i*i);
}
}
int pal
{
for(i~len/2)
if(a[i]!=a[len+1-i]) //之前一直对于这种位置比较比较迷,解决方法是找几个数字然后向后推,找到规律后用n,i代换即可
return 1; //这种循环内return结果,只有一个条件判断的方式看着真高级
return 0;
}
有关进制转换:开始写才发现自己连进制转换都忘的差不多了,10进制以上就要动用字母的操作了,所以设定一个字符串储存各位字符。循环的终止条件忘了,手推了一下觉得最后一位总是多出来,后来改成进行到最后一位就结束,然后出了循环再放在最顶上,后来在网上看发现自己想的太复杂(或者说太笨)。终止条件应该是当n==0的时候,也就刚好解决了我那个最后一位多一次操作的问题(发现自己在遇到许多数学方面的推理是总习惯用特例去解决(数学渣)。
int bas()
{
int n=传入参数;
while(n!=0)
{
a[le]=gra[n%bas] //用一个表解决10进制以上的数组问题
n=n/bas
}
}
//发现还有人用递归来写,确实很棒,这样子输出就是想要的样子了
/*不看清题意的悲伤,最后要以进制B输出*/
/*再次看错题意,是只要平方为回文就行*/
/*提交了好几遍提示文件打开错误,查了半天,结果发现是文件名打错这种低级错误*/
先写伪代码然后再打程序这种方式很舒服,虽然最开始费点时间,但是效率和思路还有得到的思考都好的多,记得NOIPd1t1就是这样过的,最后解决完问题一遍过,舒服。