重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这是小数点的问题
网站建设哪家好,找成都创新互联公司!专注于网页设计、网站建设、微信开发、微信小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了来安免费建站欢迎大家使用!
%5是每个字符串之间空5个空格输出字符串,你上面那个只有一个字符串
而%.5是取字符串的前5位输出
高 精 度 算 法
#include stdio.h
#include string.h
#include math.h
#include malloc.h
int an,bn,fa=1,fb=1; /* 把an,bn,k设为全局变量,an纪录第一个高精度数组的位数,bn纪录第二个高精度数组的位数,k纪录输出结果的位数*/
char b1[250], b2[250]; /*纪录需要计算的两个高精度数据 */
void input(int a1[],int a2[]) /*函数input为输入函数,用来纪录两个待计算的高精度数据,以数组首地址为参数.以实现返回两个高精度数据*/
{
int i,ai=1,bi=1;
scanf ( "%s%s", b1, b2 ); /*输入两个高精度数据 */
an = strlen( b1 ); /*an纪录b1的位数 */
bn = strlen( b2 ); /*bn纪录b2的位数 */
if(b1[0]==45) { an--; fa=-1;ai=0;} /*判断数组的符号 */
if(b2[0]==45) { bn--; fb=-1;bi=0;}
for (i=0; ian; i++,ai++) {a1[i]=b1[an-ai]-'0'; printf("%d",a1[i]);} /*把字符形数据b1转为整数形数据,同样用数组纪录 */
for (i=0; ibn; i++,bi++) a2[i]=b2[bn-bi]-'0'; /* 同上 */
return;
}
void addition(int a[],int b[],int q) /*高精度加法运算*/
{
int i,c[251]={0},k;
if(fa*fb0||q)
{
if(anbn) k=an;
else k=bn; /*用k纪录结果的最小位数*/
for(i=0;ik;i++)
{
c[i]=a[i]+b[i]+c[i];
c[i+1]=(int)c[i]/10;
c[i]=(int)c[i]%10;
} /*高精度加法运算过程*/
if(c[k]) k++; /*判断最后结果的位数*/
if(fa0q||fa0) printf("-");
for(i=k-1;i=0;i--) printf("%d",c[i]); /*输出结果*/
return;
}
return;
}void subtraction(int a[],int b[],int q) /*高精度减法运算*/
{
int i,f=0,c[251]={0},k;
if(fa*fb0||q)
{
if(anbn) k=an;
else /*用k纪录结果的最大位数*/
{ k=bn;
for(i=k;a[i]=b[i]i=0;i--)
if(a[i]b[i]) f=1; /*f纪录结果符号*/
} if(!f) /*高精度减法运算过程*/
for(i=0;ik;i++)
{
if(a[i]b[i])
{ a[i+1]--;
a[i]+=10;
}
c[i]=a[i]-b[i];
}
else /*当ab时的处理*/
for(i=0;ik;i++)
{
if(b[i]a[i])
{ b[i+1]--;
b[i]+=10;
}
c[i]=b[i]-a[i];
}
while(!c[k-1]k1) k--; /*判断最后结果的位数*/
if(q(fa0f||fa0!f)||fa0(fb0!f||f!q)) printf("-"); /*如果f为真是输出负号*/
for(i=k-1;i=0;i--) printf("%d",c[i]);
return;
}
} void multiplication( int a[], int b[]) /*高精度乘法运算*/
{
int i, j, c[501] = {0},k;
k = an + bn - 1; /*用k纪录结果的最大位数*/
for(i = 0; i an; i++) /*高精度乘法运算过程*/
for(j = 0;j bn; j++)
{
c[i+j] = a[i] * b[j] + c[i+j];
c[i+j+1] = c[i+j] / 10 + c[i+j+1];
c[i+j] = c[i+j] % 10;
}
while(!c[k]) k--; /*判断最后结果的位数*/
if(fa*fb0) printf("-");
for(i = k; i = 0; i--) printf("%d",c[i]); /*输出结果*/
}
main()
{
int a[250]={0},b[250]={0};
input(a,b);
printf("\n%s+%s=",b1,b2);addition(a,b,0);
printf("\n%s-%s=",b1,b2);subtraction(a,b,0);
printf("\n%s*%s=",b1,b2);multiplication(a,b);
getchar();
}
1、 高精度除以低精度;
算法:按照从高位到低位的顺序,逐位相除。在除到第j位时,该位在接受了来自第j+1位的余数后与除数相除,如果最高位为零,则商的长度减一。源程序如下:
#include stdio.h
#define N 500
main()
{
int a[N] = {0}, c[N] = {0};
int i, k, d, b;
char a1[N];
printf("Input 除数:");
scanf("%d", b);
printf("Input 被除数:");
scanf("%s", a1);
k = strlen(a1);
for(i = 0; i k; i++) a[i] = a1[k - i - 1] - '0';
d = 0;
for(i = k - 1; i = 0 ; i--)
{
d = d * 10 + a[i];
c[i] = d / b;
d = d % b;
}
while(c[k - 1] == 0 k 1) k--;
printf("商=");
for(i = k - 1; i = 0; i--) printf("%d", c[i]);
printf("\n余数=%d", d);
} 2、高精度乘以高精度(要求用尽可能少的存储单元);
算法:用数组保存两个高精度数,然后逐位相乘,注意考虑进位和总位数。源程序如下:
#include stdio.h
main()
{
int a[240] = {0}, b[240] = {0}, c[480] = {0};
int i, j, ka, kb, k;
char a1[240], b1[240];
gets(a1);
ka = strlen(a1);
gets(b1);
kb = strlen(b1);
k = ka + kb;
for(i = 0; i ka; i++) a[i] = a1[ka-i-1] - '0';
for(i = 0; i kb; i++) b[i] = b1[kb-i-1] - '0';
for(i = 0; i ka; i++)
for(j = 0; j kb; j++)
{
c[i + j] = c[i + j] + a[i] * b[j];
c[i + j +1] = c[i + j +1] + c[i + j]/10;
c[i + j] = c[i + j] % 10;
}
if(!c[k]) k--;
for(i = k-1; i = 0; i--) printf("%d", c[i]);
} 3、高精度除以高精度(要求用尽可能少的存储单元);
算法:用计算机模拟手算除法,把除法试商转化为连减。
#include stdio.h
#define N 500
int bj(int a[], int b[], int k1, int k2) /*比较大小函数*/
{
int i, t, flag; /*flag作标志位*/
if(k1 k2)
flag = 0; /*被除数小于除数返回0*/
else if(k1 k2)
flag = 1; /*被除数大于除数返回1*/
else
{ /*被除数和除数位数相等则逐位进行比较*/
i = k1;
t = 0;
while(t == 0 i 0)
{
if(a[i] b[i]) {t = 1; flag = 1;}
else if(a[i] == b[i]) i--;
else {t = 1; flag = 0;}
}
if(i == 0 t == 0) flag = 2; /*被除数等于除数返回2*/
}
return flag;
}
int jf(int a[], int b[], int k1, int k2) /*减法运算*/
{
int i, k, d[N];
for(i = 0; i k2; i++) d[i] = b[i]; /*把除数赋给数组d*/
for(i = k2; i N; i++) d[i] = 0; /*d数组无数据的高位置0*/
k = k1 - k2 - 1; /*计算减法起始位置*/
if(k 0) k = 0;
if(k 0)
{
for(i = k2 - 1; i = 0; i--) d[i + k] = d[i]; /*移动减数位数与被减数对齐*/
for(i = 0; i k; i++) d[i] = 0; /*移动后的其余位置0*/
}
for(i = 0; i k1; i++)
{
if(a[i] = d[i]) a[i] -= d[i];
else
{
a[i + 1] = a[i + 1] - 1;
a[i] = 10 + a[i] - d[i];
}
}
return k;
}
main()
{
int a[N] = {0}, b[N] = {0}, c[N] = {0}, d[N] = {0};
int i, ka, kb, m, t, t1, t2, k, x, kd, kk;
char a1[N], b1[N];
printf("Input 被除数:");
scanf("%s", a1);
ka = strlen(a1);
for(i = 0; i ka; i++) a[i] = a1[ka - i -1] - '0';
printf("Input 除数:");
scanf("%s", b1);
kb = strlen(b1);
for(i = 0; i kb; i++) b[i] = b1[kb - i -1] - '0';
kd = ka; /*保存被除数位数 */
t2 = bj(a, b, ka, kb);
m = 0;
do
{
while(a[ka - 1] == 0) ka--;
t = bj(a, b, ka, kb);
if(t = 1)
{
k = jf(a, b, ka, kb);
c[k]++;
if(k m) m = k;
t1 = 0;
for(i = k; i = m; i++)
{
x = c[i] + t1;
c[i] = x % 10;
t1 = x / 10;
}
if(t1 0) {m++; c[m] = t1; }
}
}while(t == 1);
if(t2 == 0)
{
printf("商=0");
printf("\n余数=");
for(i = kd - 1; i = 0; i--) printf("%d", a[i]);
exit(1);
}
if(t2 == 2)
{
printf("商 = 1");
printf("\n余数 = 0");
exit(1);
}
kk = kd;
while(!c[kd - 1]) kd--;
printf("商 = ");
for(i = kd - 1; i = 0; i--) printf("%d", c[i]);
while(!a[kk]) kk--;
printf("\n余数 = ");
if(kk 0)
{
printf("0");
exit(1);
}
for(i = kk; i = 0; i--) printf("%d", a[i]);
}
4、 N!,要求精确到P位(0〈P〈1000〉。
算法:结果用数组a保存,开始时a[0]=1,依次乘以数组中各位,注意进位和数组长度的变化。源程序如下:
#include stdio.h
#define M 1000
main()
{
int a[M], i, n, j, flag = 1;
printf("n=");
scanf("%d",n);
printf("n!=");
a[0] = 1;
for(i = 1; i M; i++) a[i] = 0;
for(j = 2; j = n; j++)
{
for(i = 0; i flag; i++) a[i] *= j;
for(i = 0; i flag; i++)
if(a[i] = 10)
{
a[i+1] += a[i]/10;
a[i] = a[i] % 10;
if(i == flag-1) flag++;
}
}
for(j = flag - 1; j = 0; j--)
printf("%d", a[j]);
}
可以通过输出格式说明符来指定精确到小数点后几位。
比如:
printf("%.5f\n", 3.1415927) // 输出_ 3.14159 (其中_ 代表空格)
上面的输出格式说明符%.5f 中各部分意思如下:
%f 浮点数;
".5”——(5的前面有个小数点)表示输出精确到小数点后5位。如果实际数字不足5位,则在末尾补0,若大于5位,则按四舍五入取前五位。
c语言中:
float浮点数7位有效数字。
double双精度数16位有效数字。
单精度数的尾数用23位存储,加上默认的小数
点前的1位1,2^(23+1) = 16777216。因为 10^7 16777216
10^8,所以说单精度浮点数的有效位数是7位。 双精度的尾数用52位存储,2^(52+1) = 9007199254740992,10^16
9007199254740992 10^17,所以双精度的有效位数是16位
单精度浮点数的实际有效精度为24
位二进制,这相当于 24*log102≈7.2
位10进制的精度,所以平时我们说“单精度浮点数具有7位精度”。(精度的理解:当从1.000...02变化为1.000...12时,变动范围为
2-23,考虑到因为四舍五入而得到的1倍精度提高,所以单精度浮点数可以反映2-24的数值变化,即24位二进制精度)
浮点数7位有效数字。(应该是单精度数)
双精度数16位有效数字。
浮点数取值范围:
负数取值范围为 -3.4028235E+38 到 -1.401298E-45,正数取值范围为 1.401298E-45 到 3.4028235E+38。
双精度数取值范围:
负值取值范围-1.79769313486231570E+308 到 -4.94065645841246544E-324,正值取值范围为 4.94065645841246544E-324 到 1.79769313486231570E+308。
所以精度是测量值与真值的接近程度。包含精密度和准确度两个方面精度的等级是以它的允许误差占表盘刻度值的百分数来划分的,其精度等级数越大允许误差占表盘刻度极限值越大。量程越大,同样精度等级的,它测得压力值的绝对值允许误差越大。
精度
经常使用的的精度为 2.5 、1.5 级,如果是1.0和0.5级的属于高精度,现在有的数字已经达到0.25级。
您好,很高兴回答您的问题。
在c语言中,双精度数据是用double来定义的,输出是可用lf来进行输出。
以上就是我的回答,希望能帮助到您。
#include stdio.h
int main()
{
int i, n;
double a[1000];
scanf("%d", n); //读入n(元素个数)
for(i=0;in;i++)
scanf("%lf", a[i]); //一次读入双精度数,%lf为使用双精度格式读入的控制符
return 0;
}
请采纳。