题目记录:
【涉及知识点】
1.函数的参数;
2.数组的使用;
3.循环;
4.数据的输入输出。
【题目介绍】
设有n根柱子,每根柱子上有一个圆盘,圆盘上有一个正整数,不同圆盘上的数不同。
初始时假定柱子按照其上圆盘上数的大小从左向右排列,移动规则是从左向右看,当前一根
柱子最下圆盘上数与后一根柱子最上圆盘上数相加的和是一个完全平方数时,前一根柱子上
所有圆盘移动到后一根柱子上方。要求你编写程序,输入柱子数目和圆盘上的整数,输出移
动的过程和结果。
例如,一组输入是:4,1,3,5,6,第一个数4表示有4根柱子,圆盘上的数依次是
1,3,5,6.程序运行后,可以输出1->3->6,5,c=2,表示移动是1到3,3到6,因为
1+3=4,3+6=9,而4和9是完全平方数,符合条件的移动只有这两次。移动结果是还有2根
柱子上有圆盘,即c=2,有圆盘的一根柱子上圆盘3个,有数1->3-6,有圆盘另一根柱子
上圆盘一个,有数5,它其实没有发生移动。
【功能要求】
1.任意输入数据,第一个数据为柱子的个数,后续的数据为柱子上数的值。
2.将结果分行输出,一行输出一种组合。
3.使用函数调用完成题目功能,主函数负责数据的输入与输出,子函数负责运算。
【难点与提示】
1.提示:输入:9,1,2,3,4,5,6,7,8,9输出:1->3->6,2->7->9,4->5,8,c=4输入:10,1,3,5,7,9,11,13,15,17,19输出:1->3->13,5->11,7->9,15,17->19,c=52.以一个数组接收输入的数据,具体运算数据从第二个元素开始。
3.最终剩余的柱子数为初始数据中第一个元素值减去已生成数组个数得到。
4.采用递进的形式在数组中取出一个还没有被链接的元素作为新数组的开头,向后搜
索元素,若新数组开头元素与后续元素的和是完全平方数,则将后续的元素保存在新数组中,
再以保存的新元素作为当前元素在原数组中搜索下一个能相加为完全平方数的元素,直到原
数组所有元素搜索完毕,则新数组生成。
5.反复执行上述操作直到原数组中没有元素为止。
【更上一层楼】
本题可使用数组完成,可适当提高难度使用链表结构完成功能。

c语言:

#include "stdio.h"
#include "math.h"
#define N 1000
#define bool int
#define true 1
#define false 0
void move(int a[],int n)
{
int i,j,b,c=0;
bool tag[N];
for(i=0;i<n;i++)tag[i]=false;
for(i=0;i<n;i++)
{
if(tag[i])continue;
tag[i]=true;
b=i;
c++;
printf("%d",a[i]);
for(j=i+1;j<n;j++)
{
int x=a[b]+a[j];
int y=(int)(sqrt(x));
if(tag[j])
continue;
if(y*y==x||(y+1)*(y+1)==x){
printf("->%d",a[j]);
tag[j]=true;
b=j;
}
}
printf("\n");
}
printf("c=%d\n",c);
}
int main()
{
int i,n,a[N];
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
scanf("%d",&a[i]);
move(a,n);
}
return 0;
}