求助:高手来帮忙分析一下这个c程序
一个四位数,其千位、百位、十位数字依次组成等差数列,百位上的数字是个位、千位数字的等比中项,把该四位数的数字反序所得数与原数的和为11110。求原四位数。(位等差.c)(...
一个四位数,其千位、百位、十位数字依次组成等差数列,百位上的数字是个位、千位数字的等比中项,把该四位数的数字反序所得数与原数的和为11110。求原四位数。(位等差.c)
(答案:2468或5555。)
分析:设该四位数为abcd,则由"其千位、百位、十位数字依次组成等差数列"可得(其中x为等差系数):
b=a+x (1)
c=a+2*x (2)
再由"百位上的数字是个位、千位数字的等比中项"可得:
a*d=b*b (3)
由(1)、(3)可得:
a*d=(a+x)*(a+x) (4)
main()
{ int i,j;
clrscr();
printf("原四位数为:");
for (i=0;i<=9;i++)
for (j=(i-9)/3;j<=(9-i)/3;j++)
if (((i+j)*(i+j)==i*(i+3*j))&&((2*i+3*j)*(1000+100+10+1)==11110))
printf("%d ",(i*1000+(i+j)*100+(i+2*j)*10+(i+3*j)));
}
按理解j应该是等差系数,那程序中j=(i-9)/3;j<=(9-i)/3是怎么解出来的? 展开
(答案:2468或5555。)
分析:设该四位数为abcd,则由"其千位、百位、十位数字依次组成等差数列"可得(其中x为等差系数):
b=a+x (1)
c=a+2*x (2)
再由"百位上的数字是个位、千位数字的等比中项"可得:
a*d=b*b (3)
由(1)、(3)可得:
a*d=(a+x)*(a+x) (4)
main()
{ int i,j;
clrscr();
printf("原四位数为:");
for (i=0;i<=9;i++)
for (j=(i-9)/3;j<=(9-i)/3;j++)
if (((i+j)*(i+j)==i*(i+3*j))&&((2*i+3*j)*(1000+100+10+1)==11110))
printf("%d ",(i*1000+(i+j)*100+(i+2*j)*10+(i+3*j)));
}
按理解j应该是等差系数,那程序中j=(i-9)/3;j<=(9-i)/3是怎么解出来的? 展开
展开全部
我在自己的TC上运行了该程序,的确能得到所要答案,但我仍很怀疑该程序的正确性。很明显,我们可以知道其中 i 是千位上的数字,j 是等差数列的公差,而 printf("%d ",(i*1000+(i+j)*100+(i+2*j)*10+(i+3*j)));就默认了abcd都成等差数列,所以可以说该程序是在已知答案的情况下为输出答案而输出答案。我后来还发现把for (j=(i-9)/3;j<=(9-i)/3;j++)改成for(j=0;j<=9;j++)输出的结果仍为正确答案,可见这个算法毫无科学性可言。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询