//1024 科学计数法(20 分)
//科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][1-9].[0-9]+E[+-][0-9]+,即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指数部分的正负号即使对正数也必定明确给出。
//
//现以科学计数法的格式给出实数 A,请编写程序按普通数字表示法输出 A,并保证所有有效位都被保留。
//
//输入格式:
//每个输入包含 1 个测试用例,即一个以科学计数法表示的实数 A。该数字的存储长度不超过 9999 字节,且其指数的绝对值不超过 9999。
//
//输出格式:
//对每个测试用例,在一行中按普通数字表示法输出 A,并保证所有有效位都被保留,包括末尾的 0。
//
//输入样例 1:
//+1.23400E-03
//输出样例 1:
//0.00123400
//输入样例 2:
//-1.2E+10
//输出样例 2:
//-12000000000
C:
第一种方法:参考自dulongxiang
#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]) {
char a[10000];
scanf("%s", a);
if (a[0] == '-') printf("-");
int n = strlen(a);
int zhishu = 0;
int pos = 0;
//找到E
for (int i = 0; i < n; i++) {
if (a[i] == 'E') pos = i;
}
//确定指数
for (int i = pos + 2; i < n; i++) {
zhishu = zhishu * 10 + (a[i] - '0');
}
if (zhishu == 0) {//如果指数=0,输出'E'前的数字
for (int i = 0; i < pos; i++) {
printf("%c",a[i]);
}
}
if (a[pos+1] == '-') {//如果指数<0,即0.+补0+数据
printf("0.");//先输出"0."
for (int i = 0; i < zhishu - 1; i++) {//输出(指数-1)个"0",即补0
printf("0");
}
printf("%c",a[1]);//补0后,输出a[1]
for (int i = 3; i < pos; i++) {//由于a[2]是'.',所以输出a[3]到a[pos]之间的数字
printf("%c",a[i]);
}
}else//如果指数>0,如果指数>位数,不输出0且补0;如果指数<位数,在某个位置输出'.',且补一定数量的'0'
{
for (int i = 1; i < pos; i++) {//对'.'的处理
if (a[i] == '.') continue;
printf("%c",a[i]);//输出非'.'的数字
if (2 + zhishu == i) {//i是索引,'.'是2,如果'.'(2) + 指数 并且 后续还有数字的话,需要输出'.'
if (pos - 1 == i) break;//如果后续没有数字的话,就不需要加'.',否则需要
printf(".");
}
}
for (int i = 0; i < zhishu - (pos - 3); i++) {//a[0]是符号位,a[1]是第一位数字,a[2]是'.'
//pos-3来判断'.'后有几个数字,指数 - 相应数字 = 需要补的'0'的数量
printf("0");
}
}
return 0;
}
PS:练习量还不够,考虑不够全面,思路看了较长时间
/*指针*/
#include <stdio.h>
int main()
{
char num[10000],*p = num;//*p指向num[0],对*p移位可以取数组中其他值
int exp;
scanf("%[^E]E%d",num,&exp);//这种用法是第一次见,%[^E]表示读入字符终止于E,然后读入E,读入E后的整数
if (*p++ == '-') printf("-");//如果num[0] == '-'则输出'-',否则不输出,且判断后p指向num[1]
if (exp >= 0) {//指数大于0的情况下
putchar(*p);//输出num[1],即输出第一位数字
for (p += 2; exp; exp--) putchar(*p ? *p++ : '0');//p右移2位,即指向'.'后的第一位数字
//当指数>0 时,此时p没有值时需要补0,有值的话直接输出该值
if (*p) {//当0补完后在E前还有数字
putchar('.');//输出'.'
while (*p) {//继续输出后续数字
putchar(*p++);
}
}
}
if (exp < 0) {//指数小于0时先输出'0.'
printf("0.");
for (exp++; exp; exp++) {//这里我认为是这样理解的:判断条件是 指数=0时 结束循环
//负数在逻辑运算中 结果是真,所以即使指数是负数,但是仍然满足判断条件
putchar('0');
}
for (; *p; p++) {
if (*p != '.') {//输出非'.'的数字
putchar(*p);
}
}
}
return 0;
}
参考自OliverLew
PS:思路简单粗暴,并且居然用C都实现了,同为研究生,汗颜。
网友评论