定义长度为固定值的字节的数组当做一个“大整数型”,长度为BI_SIZE,数组的0号数为最低8位,往后是更高8位,以此类推。
考虑计算过程中的溢出问题,BI_SIZE要尽量大,但也不能太大,否则算得会很慢。
#define
BI_SIZE
128
定义小数点后的十进制位数PI_NUM,略大于100。
#define
PI_NUM
103
uint8_t
R0[BI_SIZE]
uint8_t
R1[BI_SIZE]
uint8_t
R2[BI_SIZE]
……
用户使用的寄存器如下:
uint8_t
a0[BI_SIZE]
uint8_t
a1[BI_SIZE]
uint8_t
a2[BI_SIZE]
……
定义大整数相关处理函数,包含拷贝、清零、比大小、加、减、乘、移位、除、转十进制ascii等函数。
比如大整数比大小,相等返回0,a大返回1,b大返回-1。
int
BigInteger_Cmp(uint8_t
*a,uint8_t
*b)
{
uint32_t
i
for(i
=
BI_SIZE
-
1i
<
BI_SIZEi
--)
{
if(a[i]
!=
b[i])
{
if(a[i]
>
b[i])
return
1
else
return
-1
}
}
return
0
}
凡是运算函数都要使用输入地址的方式,如大整数相加,将a与b相加后的值装入地址c。
void
BigInteger_Add(uint8_t
*c,uint8_t
*a,uint8_t
*b)
调用每一个函数时,输出寄存器不能与输入寄存器冲突。
写除法函数可能比较难,请参考二进制除法相关资料。
打印函数可以用连续除以10求余获得。
函数准备完成后就可以算圆周率了,先用循环算出10的PI_NUM次方作为标准系数EXP[BI_SIZE],计算每一项时分子要先乘EXP再除。由于你的级数公制性质,建议乘和除交替进行,以免数字溢出。
每一项不断累加起来,直到当前算得的项为0为止,累加结果转十进制打印出来。
调试时PI_NUM可以先改小,如果数字正确,就可以改为100多了。
一、数学公式:
圆周长=2*π*半径
面积=π*半径²
二、算法分析:
周长和面积都依赖半径,所以要先输入半径值,然后套用公式,计算周长和面积。 最终输出结果即可。
三、参考代码:
代码如下
#include "stdio.h"
#define Pi 3.14
void main()
{
float r,c,area
printf("请输入圆的半径:")
scanf("%f",&r)
c=2*Pi*r
area=Pi*r*r
printf("该圆的周长是%.2f,面积是%.2f\n",c,area)
}