下列程序的功能是:在3位整数(100至999)小寻找符合下面条件的整数,并依次从小到大存入数组 b中:它既是完全平方数,又有两位数字相同,例如144,676等。
请编制函数int js Value(int bb[]实现此功能,满足该条件的整数的个数通过所编制的函数返回。
最后调用函数writeDat()把结果输出到文件OUT12.DAT中。
注意:部分源程序已给出。
请勿改动主函数main()和写函数writeDat()的内容。
试题程序:
#include <stdio.h>
int jsValue(int bb[] )
main ( )
int b[20], num;
num = jsValue (b);
writeDat (num, b);
writeDat int num, int b[] )
FILE *out;
int i;
out = fopen("OUT12.DAT", "w");
fprintf(out, "%d\n", num);
for(i = 0; i < num; i++)
fprintf(out, "%d\n", b[i] );
fclese(out);
参考答案:
int jsValue(int bb[])
{
int i,j,k=0;
int hun,ten,data;
for(i-100;i<=999;i++)
{
j=10;
while(j*j<=i)
{
if(i==j*j) /*如果该数是完全平方数*/
{
hun=i/100; /*求该数的百位数字*/
data=i-hun*100;/*得到后两位数*/
ten=data/10; /*求该数的十位数字*/
data=data-ten*10;/*求该数的个位数字*/
if(hun==ten || hun==data || ten==data) /*有两位数字相同*/
{bb[k]=i; /*则把该数存入数组bb中*/
k++;} /*统计满足条件的数的个数*/
}
j++;
}
}
return k; /*返回满足该条件的整数的个数*/
}
解析: 解答本题,首先应该考虑用一个for循环宋依次取得100到999之间的各个数,并对当前所取得的数进行两个条件判断:一是判断该数是否是完全平方数:二是判断该数是否有两位数字相同。如果以上两个条件同时满足,则把该数存放到b数组中,尽管题目要求所存的数必须从小到大,但我们取数的过程本身就是从小到大取得,因此,排序工作是没有必要做的,按照取数的顺序,把满足条件的数值存放到数组b中就可以了。判断某个数是否是完全平方数的方法是看该数是否可以拆成完全相同的两个数的积(当然要拆成的两个数一定是两位数),因此,我们再利用一个循环用10以上的两位数逐个去拆被判断的数,如果被判断的数恰好可以被完全拆分,则第一个条件成立,接着就开始依次取得被判断的数的百位、十位、个位上的数字值,看是否有两位数字相同。取得每一位上的数字值可以用“hun=i/100:data=i-hun*100: ten=data/10:data=data-ten*10:”几条语句来实现,hun变量得到的是百位上的数字,ten变量得到的是十位上的数字,data变量得到的是个位上的数字。