前提说明: 从题中我们可以看出题目中对整数的位数已经限制为5位,我们在这里先不管这个限制,无论输入什么数字都将其按照后面的问题输出
我们平时在观察到一个数字的时候,要得到其位数我们会选择直接数出来,但计算机并不能拥有人类直接数数的功能。
那计算机如何实现呢? 在这里我们先举一个栗子:
随机数 : 12345
实现 : 我们知道整型变量之间的除法结果只保留个位,那么我们可以用循环体不断让这个数字除以10,并创建一个整形变量来进行记录除以10的次数。 (假设记录变量为count)
Start—>12345/10 = 1234,count = 1 —> 1234/10 = 123,count = 2 —> 123/10 = 12,count = 3 —> 12/10 = 1,count = 4 —> 1/10 = 0 , count=5 —> end
int GetFigures(int n) //计算数字位数的函数
{
int count = 0; //将记录数字除以10的次数的整型变量进行初始化
while(n)
{
n/=10;
count++;
}
return count; //返回次数即位数
}
我们依旧用第一个栗子的数字12345
理解 : 其实相当于将数字的末尾位上的数字不断打印出去,也可以理解成将末尾数字丢出去
实现 : 我们用循环使数字与10取余将其末尾数字得出后输出,然后我们可以再用第一题的算法将该数字的末尾数去掉,不断循环,最终实现逆序打印
Start—>12345%10 = 5,12345/10 = 1234 —> 1234%10 = 4,1234/10 = 123 —> 123%10 = 3,123/10 = 12 —> 12%10 = 2,12/10 = 1 —>1%10 = 1, 1/10 = 0 —> end
void PrintReverse(int n)
{
do
{
int count1 = n; //将n存入进行取余的变量count1中
count1%=10; //进行取余
n/=10; //进行除法
printf("%d ",count1); //打印末尾数字
}while(n);
printf("\n");
}
理解:正序输出与逆序有一定的相似,但正序的不同之处在于正序得先输出最左边位上的数字,而要得到最左边位上的数字,所以我们要将数字除以10^(该数的位数–1)
实现 : 先将该数除以10^(该数的位数–1)的结果存入建立的变量中后 ,使该数和10^(该数的位数–1)取余 得到新的数字,打印变量,之后便不断循环这一过程
(PS:完全可以在第二步用数组存储逆序的数字,再将数组逆输出便是正序)
Start—>12345/10^(5–1) = 1,12345%10^(5–1) = 2345 —>2345/10^(4–1) = 2,2345%10^(4–1) = 345 —> 345/10^(3–1) = 3,345%10^(3–1) = 45 —> 45/10^(2–1) = 4,45%10^(2–1) = 5 —>5/10^(1–1) = 5,5%10^(1–1) = 0 —> end
void PrintOrder(int n)
{
int tmp1 = (int)pow(10.0,GetFigures(n)-1); //将10^(该数的位数-1)存入变量tmp1
do
{
printf("%d ",n/tmp1); //打印首位数字
n%=tmp1; //数字取余
tmp1/=10; //调整10^(该数的位数-1)的大小
}while(n!=0);
printf("\n");
}
#include
#include
int GetFigures(int n) //计算数字位数的函数
{
int count = 0; //将记录数字除以10的次数的整型变量进行初始化
while(n)
{
n/=10;
count++;
}
return count; //返回次数即位数
}
void PrintReverse(int n)
{
do
{
int count1 = n; //将n存入进行取余的变量count1中
count1%=10; //进行取余
n/=10; //进行除法
printf("%d ",count1); //打印末尾数字
}while(n);
printf("\n");
}
void PrintOrder(int n)
{
int tmp1 = (int)pow(10.0,GetFigures(n)-1); //将10^(该数的位数-1)存入变量tmp1
do
{
printf("%d ",n/tmp1); //打印首位数字
n%=tmp1; //数字取余
tmp1/=10; //调整10^(该数的位数-1)的大小
}while(n!=0);
printf("\n");
}
int main()
{
/*限制位数
int n;
do
{
scanf("%d",&n);
}while(n > 100000);
*/
printf("%d\n",GetFigures(n)); //打印位数
PrintReverse(n); //调用逆序打印函数
PrintOrder(n); //调用正序打印函数
return 0;
}