问答题
下列程序的功能是选出5000以下符合条件的自然数。条件是:千位数字与百位数字之和等于十位数字与个位数字之和,且千位数字与百位数字之和等于个位数字与千位数字之差的10倍。计算并输出满足条件的4位自然数的个数cnt及它们的和sum。请编写函数countValue()实现程序功能,最后调用函数writeDAT(),把结果cnt和sum输出到文件OUT.DAT中。
请勿改动主函数main()和写函数writeDAT()的内容。
[试题程序]
#include<stdio.h>
int cnt, sum;
void writeDat();
void countValue()
{
}
void main()
{
cnt=sum=0;
countValue();
printf("满足条件的自然数的个数=%d\n", cnt);
printf("满足条件的自然数的和=%d\n", sum);
writeDAT();
}
void writeDAT()
{
FILE*fp;
fp=fopen("OUT.DAT", "w");
fprintf(fp, "%dkn%d\n", cnt, sum);
fclose(fp);
}
【正确答案】
【答案解析】void countValue()
{
int i; /*循环控制变量*/
int a1, a2, a3, a4; /*定义变量保存4位数的每位数字*/
for(i=5000; i>=1000; i--) /*依次取每一个数进行判断*/
{
a4=i/1000; /*求4位数的千位数字*/
a3=i%1000/100; /*求4位数的百位数字*/
a2=i%100/10; /*求4位数的十位数字*/
a1=i%10; /*求4位数的个位数字*/
if(a4+a3==a2+a1 && a4+a3==(a1-a4)*10)
{ /*千位数与百位数之和等于十位数与个位数之和,且千位数与百位数之和等于个位数与千位数之差的10倍*/
cnt++; /*则统计满足条件的数的个数*/
sum+=i; /*将满足条件的数求和*/
}
}
}
[考点] 本题考查对多个整数的筛选以及统计。考查的知识点主要包括:多位整数的分解算法,逻辑表达式。
此题属于4位数的筛选类题型。解此题需主要解决2个问题:问题1如何取得4位数的各个数位数字;问题2如何通过条件(千位数字与百位数字之和等于个位数字与十位数字之差的10倍)筛选出满足条件的数并计算个数及和值;分析题意“5000以下的自然数”,“该数存在千位数字”可知:本题的查找范围为“1000<=i<5000”。通过问题分析,得出解此题的思路为:先求出每个数的各位数字,再根据各数位数字筛选出满足条件的数,对满足条件的数进行统计个数和累加和的运算。对于问题1通过算术运算取余和除法可以分解得到4位数的各个数位上的数字;问题2通过if条件判断语句和逻辑表达式可以实现。