7章8题:写一个函数,输入一个4位数字,要求输出这4个数字字符,但每两个数字间空一个空格.如输入1990,应输出"1 9 9 0".
为了程序有更强的适应性,所以我把题目改成'不固定位数的',如下"一.实现目标"中所描述.
一.实现目标
连续输入n位的数字,输出每一位上的数,每俩数中间空1个空格.
例如:输入12345,输出1 2 3 4 5.
二.原理
1.十进制数上的每一位都是10的整数次幂的整数倍.
2.最高位数字,用原整形除以该位对应的10的n次方整数,获得的结果必须规定为整形,则可以提取出该位上的数字.
例如下代码片段(提取a的第1位上的数):b为对应所求的数
int a,b; //a是原数,b是千位上的数
a=1234;
b=a/1000; //b=1234/1000=1 (因为b是整形,所以1.234取整数1)
关于代码的解释:请仔细阅读注释.
3.最高位之后的数字,用原整形数减去该位之前的所有位,再除以该位对应的10的n次方整数,提取出该位上的数字.
例如下代码片段(提取a的第1和2位上的数):b.c为对应所求的数
int a,b,c; //a是原数,b是千位上的数,c是百位上的数
a=1234;
b=a/1000; //b=1234/10^3=1 (因为b是整形,所以1.234取整数1)
c=(a-b*1000)/100; //a-b*10^3=1234-1*10^3=234, c=234/10^2=2 (因为c是整形,所以取整)
//10^3=1000,10^2=100...同理
关于代码的解释:请仔细阅读注释.
三. 用C语言实现
#include <stdio.h>
#include <math.h> //下面需要用的log10函数来自该数学库
void print_AddSpace(int a); //声明'获取每一位的数字并在每2个数中间空1个空格'的函数
int power(int a,int b); //声明'整数求幂'函数
int main()
{
int a;
printf("Enter a every digit number:");
scanf("%d",&a);
print_AddSpace(a);
return 0;
}
void print_AddSpace(int a)
{
int digits,i,p[80]; //P数组用来存每一位上的数,容量要够大,最好比数字的位数要富裕几位.
digits=log10(a)+1; //digits是数字a的位数,例如log10(1999)=3,1999是4位数,所以位数=log10(number)+1.
printf("This is %d digits number.\n",digits);
for(i=0;i<digits;i++) //循环由最高位至最低位计算每一位上的数字,并按从前到后的顺序依次赋值给P数组中的元素
{
p[i]=a;
int j;
for(j=0;j<i;j++) //循环减去前面的位数的数字(注意:不要忘记乘相应的10次幂)
{
p[i]=p[i]-p[j]*power(10,digits-1-j); //分别减去前面位数上的数字乘以相应的10的次幂
} //循环结束,若a=1234当i=2时,则相当于p[n]=a-p[0]*1000-p[1]*100=1234-1*1000-2*100=34
p[i]=p[i]/power(10,digits-1-i); //若a=1234当i=2时,则相当于计算出了十位上的数字p[n]=34/10^(digits-1-i)=34/10^(4-1-2)=34/10=3(因为p[i]为整形,所以3.4取整数3)
}
for(i=0;i<digits;i++)
{
printf("%d ",p[i]);
}
}
int power(int a,int b) //这里讲下为什么不用math库里的pow,因为pow的计算值是double型,精确度飘忽不定,计算10的3次幂然后取整有时候是999有时候又是1001,而我们上面必须是准确的10的倍数,所以我们自己写一个参数和结果都为整形的计算幂的函数
{
int i,results=1;
for(i=1;i<=b;i++)
results*=a;
return results;
}
关于代码的解释:请仔细阅读注释.