小言_互联网的博客

C语言 获得多位数每一位上的数字(C程序设计,习题7章8题扩展)

347人阅读  评论(0)

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;
}

关于代码的解释:请仔细阅读注释.

 


转载:https://blog.csdn.net/qq_29847807/article/details/101855026
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场