1.3【问题描述】
我们要求找出具有下列性质数的个数(包含输入的自然数n)。先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理: 1.不作任何处理; 2.在它的左边加上一个自然数,但该自然数不能超过原数最高位数字的一半; 3. 加上数后,继续按此规则进行处理,直到不能再加自然数为止.
【输入】 第一行一个数t,表示有t组数据 之后每组数据占一行,每行一个数n
【输出】 每组数据占一行,一个数,表示满足条件的数的个数
【输入范例】1 6
【输出范例】6
2.需求分析
本演示程序用VC++6.0编写,完成对自然数的扩展。
先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理: 1.不作任何处理;
2.在它的左边加上一个自然数,但该自然数不能超过原数最高位数字的一半; 3. 加上数后
继续按此规则进行处理,直到不能再加自然数为止.
【输入】 第一行一个数t,表示有t组数据 之后每组数据占一行,每行一个数n
【输出】 每组数据占一行,一个数,表示满足条件的数的个数
【输入范例】1 6
【输出范例】6
3.概要设计
1)为了实现上述程序功能,需要定义数组来接收输入的t组数据的具体数据:
#include<stdio.h>
void shu()
{
int t,i,n,m; //m用来接收最高位数字,n是满足条件的数的数字
int s[1000]; //接收输入的数据
// printf("请输入数据组数t:");
scanf("%d",&t);
// printf("请输入t个具体数据:");
for(i=0;i<t;i++){
scanf("%d",&s[i]);
m=s[i];
2)本程序包含2个函数:
①计算满足条件的个数函数 shu()
② 主函数main()
各函数间关系如下:
main() shu()
4.详细设计
1)题目中输入的是自然数,且n<=100,使用int 型实现就可以了。
2)在稿纸上算出最高位数为1-9的满足条件的数的个数。(1,1),(2,2),(3,2),(4,4),(5,4),(6,6),(7,6),(8,10),(9,10)。
#include<stdio.h>
void shu()
{
int t,i,n,m; //m用来接收最高位数字,n是满足条件的数的数字
int s[1000]; //接收输入的数据
// printf("请输入数据组数t:");
scanf("%d",&t);
// printf("请输入t个具体数据:");
for(i=0;i<t;i++){
scanf("%d",&s[i]);
m=s[i];
if(m<0||m>1000)printf("输入的数据超出范围!\n");//根据题目要求的范围
else {
if(m==0)n=m;
while(m>=10)m=m/10;//求出输入的自然数的最高位
if(m==1)n=1;
if(m==2||m==3)n=2;
if(m==4||m==5)n=4;
if(m==6||m==7)n=6;
if(m==8||m==9)n=10;
printf("%d\n",n);//(由于最高位数数字在1-9之间,只要满足条件就输出相应结果)
}
}
}
void main()
{
shu();
}
5.调试分析
#include<stdio.h>
void shu()
{
int t,i,n,m;
int s[1000];
scanf("%d",&t);
for(i=0;i<t;i++){
scanf("%d",&s[i]);
m=s[i];
if(m<0||m>1000)printf("输入的数据超出范围!\n");
else {
if(m==0)n=m;
while(m>=10)m=m/10;
if(m==1)n=1;
if(m==2||m==3)n=2;
if(m==4||m==5)n=4;
if(m==6||m==7)n=6;
if(m==8||m==9)n=10;
printf("%d\n",n);
}
} //时间复杂度T(n)=O(n),空间复杂度S(n)=O(1)
}
void main()
{
shu();
}
调试时,先进入main()函数,再调用shu()函数,定义形参,申请数组空间,输入t值,空格,再输入t个数据,接下来就对各个数据进行判断输出。
6.使用说明
程序名为1.exe,运行环境为VC++6.0。程序执行后显示
依次输入组数t和t个数据,每输入一个数就用空格间隔再输入下一个数,最后输入换行字符即输出结果。
7.测试结果
1)
输入1 6: 即1组数据和1个数据的具体数据 6
输出:6
2)
输入2 16 58: 即2组数据和2个数据的具体数据 16 58
输出:1 4
3)
输入1 -9: 即1组数据和1个数据的具体数据 -9
输出:输入的数据超出范围!