日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言PAT刷题 - 1024 科学计数法

發(fā)布時間:2023/12/14 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言PAT刷题 - 1024 科学计数法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

作者的話:若有朋友復制代碼去PAT試著運行遇到問題的:
1.可能是格式問題,可以先把從本站復制的代碼粘貼到記事本,再把記事本里的代碼復制,然后粘貼到PAT的代碼區(qū),提交本題回答,應該就可以了;
2.可能是注釋原因,PAT有時候檢測到注釋會編譯錯誤,所以可以先把注釋刪了,再進行提交回答;
3.可能是作者當初根據(jù)題目寫出來的代碼仍存在一些疏漏,而恰好當時的測試機制沒那么完善,沒檢測出問題。后面測試機制有所更新,故出現(xiàn)問題,若有相關需要的可以評論區(qū)留言或私信作者,我看到的話會去再查一下疏漏之處,然后更新文章。

一、題目描述
科學計數(shù)法是科學家用來表示很大或很小的數(shù)字的一種方便的方法,其滿足正則表達式 [±][1-9].[0-9]+E[±][0-9]+,即數(shù)字的整數(shù)部分只有 1 位,小數(shù)部分至少有 1 位,該數(shù)字及其指數(shù)部分的正負號即使對正數(shù)也必定明確給出。

現(xiàn)以科學計數(shù)法的格式給出實數(shù) A,請編寫程序按普通數(shù)字表示法輸出 A,并保證所有有效位都被保留。

輸入格式:
每個輸入包含 1 個測試用例,即一個以科學計數(shù)法表示的實數(shù) A。該數(shù)字的存儲長度不超過9999 字節(jié),且其指數(shù)的絕對值不超過9999。

輸出格式:
對每個測試用例,在一行中按普通數(shù)字表示法輸出 A,并保證所有有效位都被保留,包括末尾的0。

輸入樣例 1:
+1.23400E-03
輸出樣例 1:
0.00123400
輸入樣例 2:
-1.2E+10
輸出樣例 2:
-12000000000
二、解題思路
讀題:

1.接收科學記數(shù)法格式的實數(shù)A,輸出普通數(shù)字法表示的實數(shù)A;
2.因為要求所有有效位都被保留,包括末尾的0,采用浮點型變量存儲有有效位位數(shù)限制,所以只能采用字符數(shù)組來存儲實數(shù)A;
3.因為題目限制該數(shù)字的存儲長度不超過9999 字節(jié),且其指數(shù)的絕對值不超過9999,所以對于科學記數(shù)法格式的±AE±X(A為浮點數(shù),X為指數(shù)),最壞的情況是兩個正負號總共占2個字節(jié),E占1個字節(jié),X=9999,占四個字節(jié),前面這些總共占7個字節(jié),A可占9992個字節(jié),即可以放9991個數(shù)字和一個小數(shù)點。最后的結(jié)果最壞是-0.0……(A前面最多可以有9999個連續(xù)的0,包括小數(shù)點前面的0;此時A是去除小數(shù)點后的一串數(shù)字)A,其中-和小數(shù)點占2個字節(jié),A前面的0占9999個字節(jié),A占9991個字節(jié)(因為小數(shù)點在前面算過了,這里的A只包含數(shù)字),總共19992個字節(jié),為了后面方便輸出,一般會以字符串格式輸出數(shù)組a的內(nèi)容,所以還要多開拓一個字節(jié)的空間存儲’\0’,總共19993的字節(jié),所以為了方便,也為了防止少算某些空間,給字符數(shù)組a設置20000個元素。

思路:
1.設置需要的變量,設置循環(huán)接收科學記數(shù)法格式的實數(shù)A存儲在字符數(shù)組a中,當接收到’E’時,把此時的i的值賦值給n,即之后a[n]=E;
2.首先對第一個正負號進行判斷,這個正負號決定了實數(shù)A的正負性,根據(jù)題目給出的輸入輸出樣例,可知當實數(shù)A為正時,不輸出’+‘;當實數(shù)A為負時,輸出’-‘。設置判斷語句,處理好正負性的表現(xiàn)形式;
3.設置循環(huán),計算出指數(shù)的值(即數(shù)組a下標從n+2開始,一直到存儲換行符的a[i]之前,這一連串數(shù)字組成的數(shù));
4.設置判斷語句,根據(jù)指數(shù)的正負性進入相應的分支:
(1)當指數(shù)為正且指數(shù)數(shù)字部分sum < (n - 3)(小數(shù)點后的數(shù)字總共是n-3個)時,此時小數(shù)點后移sum位,由于小數(shù)點后依然有小數(shù),所以小數(shù)點保留;
(2)當指數(shù)為正且sum>=(n - 3)(小數(shù)點后的數(shù)字總共是n-3個)時,小數(shù)點后移到原小數(shù)點后的所有數(shù)字后面,此時小數(shù)點后已經(jīng)沒有小數(shù),小數(shù)點不再需要。若sum-(n-3)后>0,則根據(jù)差在所有數(shù)字后面補上0;
(3)當指數(shù)為負時,若指數(shù)的數(shù)字部分sum為0,將科學記數(shù)法格式下實數(shù)A的數(shù)字部分不作改變,直接進行輸出;若不為0,小數(shù)點后的數(shù)字分別向后移動sum位,小數(shù)點前的整數(shù)部分后移sum+1位(因為他要多跨越一個’.'),小數(shù)點不變,移動后的數(shù)字前面是0.0……的形式。
三、具體實現(xiàn)
0.標準C源程序框架

#include <stdio.h> int main() {return 0; }

1.設置需要的變量,設置循環(huán)接收科學記數(shù)法格式的實數(shù)A存儲在字符數(shù)組a中,當接收到’E’時,把此時的i的值賦值給n,即之后a[n]=E;

char a[20000];//該數(shù)字的存儲長度不超過 9999 字節(jié),且其指數(shù)的絕對值不超過 9999int i = 0;int n = 0;int sum = 0;do {a[i]=getchar();if(a[i]=='E') n = i;//a[n]='E'} while (a[i++]!='\n');

2.首先對第一個正負號進行判斷,這個正負號決定了實數(shù)A的正負性,根據(jù)題目給出的輸入輸出樣例,可知當實數(shù)A為正時,不輸出’+‘;當實數(shù)A為負時,輸出’-'。設置判斷語句,處理好正負性的表現(xiàn)形式;

if (a[0] == '+');//為正時啥也不用干else printf("-");//為負時輸出'-'

3.設置循環(huán),計算出指數(shù)的數(shù)字部分的值(即數(shù)組a下標從n+2開始,一直到存儲換行符的a[i]之前,這一連串數(shù)字組成的數(shù));

for (i=n+2;a[i]!='\n';i++){sum = sum * 10 + a[i]-'0';//指數(shù)的值}

4.設置判斷語句,根據(jù)指數(shù)的正負性進入相應的分支:
(1)當指數(shù)為正且指數(shù)數(shù)字部分sum < (n - 3)(小數(shù)點后的數(shù)字總共是n-3個)時,此時小數(shù)點后移sum位,由于小數(shù)點后依然有小數(shù),所以小數(shù)點保留;

if (a[n + 1] == '+')if (sum < (n - 3)){for (i = 3; i < (3 + sum); i++){a[i - 1] = a[i];}a[sum + 2] = '.';a[n] = '\0';printf("%s",&a[1]);}

(2)當指數(shù)為正且sum>=(n - 3)(小數(shù)點后的數(shù)字總共是n-3個)時,小數(shù)點后移到原小數(shù)點后的所有數(shù)字后面,此時小數(shù)點后已經(jīng)沒有小數(shù),小數(shù)點不再需要。若sum-(n-3)后>0,則根據(jù)差在所有數(shù)字后面補上0;

else{printf("%c",a[1]);a[n] = '\0';printf("%s", &a[3]);sum -= n - 3;while (sum--) printf("0");}

(3)當指數(shù)為負時,若指數(shù)的數(shù)字部分sum為0,將科學記數(shù)法格式下實數(shù)A的數(shù)字部分不作改變,直接進行輸出;若不為0,小數(shù)點后的數(shù)字分別向后移動sum位,小數(shù)點前的整數(shù)部分后移sum+1位(因為他要多跨越一個’.'),小數(shù)點不變,移動后的數(shù)字前面是0.0……的形式。

else{for (i=n-1;i>=1;i--){if(sum!=0){if (i == 2);else if (i == 1){a[i + sum + 1] = a[i];a[1] = '0';}else{a[i + sum] = a[i];a[i] = '0';}}}for (i = n; i < 1 + sum + 1; i++)a[i] = '0';a[n + sum] = '\0';printf("%s", &a[1]);}

四、測試數(shù)據(jù)
輸入樣例 1:
+1.23400E-03
輸出樣例 1:
0.00123400

輸入樣例 2:
-1.2E+10
輸出樣例 2:
-12000000000

輸入樣例 3://當指數(shù)為0時你的程序能否返回正確的結(jié)果?
+1.23400E-0
輸出樣例 3:
1.23400

輸入樣例 4://當指數(shù)引入的0的個數(shù)大于原數(shù)字長度時你的程序能否返回正確的結(jié)果?
+1.23400E-100
輸出樣例 4:
0.00……123400(1234前面總共100個0,包括小數(shù)點前面的0)

五、全部代碼

#include <stdio.h> int main() {char a[20000];//該數(shù)字的存儲長度不超過 9999 字節(jié),且其指數(shù)的絕對值不超過 9999int i = 0;int n = 0;int sum = 0;do {a[i]=getchar();if(a[i]=='E') n = i;//a[n]='E'} while (a[i++]!='\n');if (a[0] == '+');//為正時啥也不用干else printf("-");//為負時輸出'-'for (i=n+2;a[i]!='\n';i++){sum = sum * 10 + a[i]-'0';//指數(shù)的值}if (a[n + 1] == '+')if (sum < (n - 3)){for (i = 3; i < (3 + sum); i++){a[i - 1] = a[i];}a[sum + 2] = '.';a[n] = '\0';printf("%s",&a[1]);}else{printf("%c",a[1]);a[n] = '\0';printf("%s", &a[3]);sum -= n - 3;while (sum--) printf("0");}else{for (i=n-1;i>=1;i--){if(sum!=0){if (i == 2);else if (i == 1){a[i + sum + 1] = a[i];a[1] = '0';}else{a[i + sum] = a[i];a[i] = '0';}}}for (i = n; i < 1 + sum + 1; i++)a[i] = '0';a[n + sum] = '\0';printf("%s", &a[1]);}return 0; }

總結(jié)

以上是生活随笔為你收集整理的C语言PAT刷题 - 1024 科学计数法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。