C语言之科学技术法
50 科学记数法 对于非常大或者非常小的数据,我们通常用科学记数法来表示。例如在科技文献和电脑中经常遇到的 2.3×106 (计算机中的科学记数法表示为:2.3E6),或者 9.18×10-5 (科学记树法表示:9.18E-5)这种类型的数据。
输入:
用科学记数法表示的数据。即为符合C语言表示的科学记数法表示。
输出:
该数据的双精度表示
说明:
输入数据的精度不高于小数点后50位。
输入数据时,在实数和幂之间有空格进行分隔,空格个数不定。
结果保留到小数点后8位,如不足8位用0补足,超过8位则截断,不进行四舍五入的处理。
额,关于这个题,我想了一个很笨拙的办法,结果悲剧了......它根本不给我输出。请各位大神指点啊~
由于我写的很乱,所以我加了一点自述,可能还是很乱,大家费心了。还请大家提些修改意见
谢谢各位!
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char *argv[])
{ char input[80];int work[2][80],i,j,point,p,t,k,amount;
long q; /*input是输入时用的字符数组,我都给放到input里了*/
gets(input); /*work这个二维数组,第一维是整数部分,第二维是小数部分*/
for(i=0;i<80;i++)
for(j=0;j<80;j++)
work[j]=-1;
k=0;p=1;
for(i=0,t=0;input[t]!='\0';i++,t++)
{
if(input[t]==' ') i--; /*i是work里的记数器,t是input里的计数器*/
if(input[t]>='0'&&input[t]<='9')
work[k]=input[t]-'0';
if(input[t]=='.')
{
i--;point=i; /*point是小数点的位置*/
}
if(input[t]=='E'||input[t]=='e')
{
k=1;i=0; /*换到第二维,i归0*/
}
if(input[t]=='-')
{
p=-1;i--;
}
}
for(j=0;work[1][j]!=-1;j++); /*这句是测数组有效长度的*/
for(i=0;i<=j;i++)
q+=work[1][j]*pow(10,j-i); /*懒懒地调用了一个库函数pow......*/
point+=p*q;i=point;amount=0; /*把小数点的位置挪一下*/
if(point<0) /*amount是记小数的输出次数的*/
{ printf("0.");i++; /*分整数和小数分别输出*/
for(;i<0&&amount<8;i++)
{ printf("0");
amount++;
}
for(j=0;work[0][j++]!=-1&&amount<8;j++)
{
printf("%d",work[0][j]);
amount++;
}
printf("\n");
}
else
{ for(j=0;i>=0&&amount<8;i--,j++)
printf("%d",work[0][j]);
printf(".");
for(;work[0][j++]!=-1&&amount<8;j++)
{printf("%d",work[0][j]);amount++;}
printf("\n");
}
system("PAUSE");
return 0;
}
追问:谢谢,可是我还是想知道我写的那里错了(除了脏乱差之外......)
答案:#include<stdio.h.
double f(int n)
{
if(n==1)
return 1;
else
return (1.0/(n*(n-1)+f(n-1));
}
voie main()
{
int n;
scanf("%d",&n);
printf("%lf\n",f(n));
}
上一个:我是学C语言的新手我想知道C语言这两种写法有什么区别?
下一个:在Microsoft Visual C++环境下 计算sizeof(y) struct a; char b[30] data *last,*next char c }y