C語言:計算分數精確值
1 計算分數精確值(10分)
題目內容:
由於計算機內部表達方式的限制,浮點運算都有精度問題,為了得到高精度的計算結果,就需要自己設計實現方法。
(0,1)之間的任何浮點數都可以表達為兩個正整數的商,為了表達這樣兩個數的商,可以將相除的結果存放在一維陣列中,陣列的每個元素存放一位十進位制數字。即商的第一位存放在第一個元素中,第二位存放在第二個元素中,以此類推,就可以用陣列來表達一個高精度的除法結果了。
如16/19的結果0.8421052631…就可以依次存放8、4、2、1、0、5、2、6、3、1…在陣列中。
而除法的過程,則可以模仿人工列豎式做除法的方式,先將被除數乘以10,得到一位商以後,將餘數乘以10作為下一輪計算的被除數:
160/19->8餘8
80/19->4餘4
…
當某次餘數為0時,則表明除盡。
現在,請寫一個程式,輸入一個分數,計算出它的小數形式。無論是否可以除盡,輸出最多小數點後200位。
輸入格式:
形如
a/b
的兩個數,其中10<=a
#include <stdio.h>
#include <stdlib.h>
/*
現在,請寫一個程式,輸入一個分數,計算出它的小數形式。無論是否可以除盡,輸出最多小數點後200位。
*/
int *calculator(int a, int b);
int main() {
// printf("Hello, World!\n");
int a, b;
// printf("%s\n", "input a,b from console:");
scanf("%d/%d", &a, &b);
// a = 16, b = 19;
// printf("a/b = %d/%d\n", a, b);
int *pInt = calculator(a, b);
int *p = pInt;
// printf("第一位是0哦 %d\n",*p);
printf("%s", "0.");
int count = 0;
while (++p != NULL) { // 剛好跳過第一位!
if (count > 200) {
break;
}
printf("%d", *p);
count++;
}
printf ("%s", "\n");
return 0;
}
int *calculator(int a, int b) {
// 10<=a<b<100。
if (a < 10 || b >= 100 || a >= b) {
printf("%s\n", "10<=a<b<100 , 條件不滿足");
return NULL;
}
int *ret = calloc(200, sizeof(int));
int *tmp = ret;
int count = 0;
while (a % b != 0) {
if (a < b) {
a *= 10;
tmp++;
}
*tmp = (a / b);
a = a % b;
count++;
if (count > 200) {
*tmp = '\0'; // useless
break;
}
}
return ret;
}
console:
16/19 # 這個是輸入,下面的是輸出
0.842105263157894736842105263157894736842105263157894736842105263157894736842105263157894736842105263157894736842105263157894736842105263157894736842105263157894736842105263157894736842105263157894736840
Process finished with exit code 0
相關推薦
C語言:計算分數精確值
1 計算分數精確值(10分) 題目內容: 由於計算機內部表達方式的限制,浮點運算都有精度問題,為了得到高精度的計算結果,就需要自己設計實現方法。 (0,1)之間的任何浮點數都可以表達為兩個正整數的
C語言:計算階乘和階乘的和
從鍵盤輸入一個數,用C語言計算該數的階乘 #include <stdio.h> #include<stdlib.h> int main() { int i,sum = 0, p = 1, n; scanf("%d",&n); if(
C語言:計算某年某月某日是這一年的第幾天
C語言:計算某年某月某日是這一年的第幾天 我是一名在校大學生,初次寫部落格,希望各位大佬不喜勿噴,這個小程式,僅供參考,希望對大家有所幫助。 分析題意: 1.判斷使用者輸入的年數是閏年還是平年。 2.如何將不同月份的天數相加。 定義: 1.Input()函式,接收使用者輸
C語言:計算兩個集合的並集
#include<stdio.h> #include<stdlib.h> #include<time.h> #define NUMBER1 7 #define NUMBER2 5 void createCollect(int [],int
我的第四個C語言:計算圓柱體的表面積和體積。
問題及程式碼: 問題:計算圓柱體的表面積和體積。 程式碼:#include <stdio.h> #include <stdlib.h> int main() { float r,h,S,V; printf("請輸入圓柱體的半徑\n"
c語言:計算存款利息
程式: #include<stdio.h> int main() { float P0=1000,R1=0.0036,R2=0.0225,R3=0.0198,P1,P2,P3 ; P1
C語言:計算兩個集合的交集
#include<stdio.h> #include<stdlib.h> #include<time.h> #define NUMBER1 7 #define NU
C語言:計算並輸出S=1+(1+2^0.5)+(1+2^0.5+3^0.5)...+(1+2^0.5+3^0.5+...+n^0.5)
輸出 nbsp clas return %d span file fprintf 計算 //計算並輸出S=1+(1+2^0.5)+(1+2^0.5+3^0.5)...+(1+2^0.5+3^0.5+...+n^0.5) 1 #include<math.h>
C語言:計算並輸出給定10個數的方差。
include pen printf style i++ double The span col //計算並輸出給定10個數的方差。 1 #include<math.h> 2 #include<stdio.h> 3 double fu
C語言:指針實現交換兩個變量的值
實現 urn sign ret 語言 div title void itl 用指針交換兩個變量的值(10分) 題目內容: 用指針交換兩個變量的值 主函數參考: int main( ) { int a,b; scanf("%d%d",&a,&b)
C語言:求10 個整數中最大值
求10 個整數中最大值思路:求10 個整數中最大值,可以利用陣列來完成對10個數的儲存,再用迴圈語句和條件語句來判斷數的大小, 把最大值賦值給最大值變數max,然後輸出最大值。 程式碼如下: #include<stdio.h> int main() { int i,max;
C語言:給定兩個整形變數的值,將兩個值的內容進行交換
給定兩個整形變數的值,將兩個值的內容進行交換,有三種不同的方法。第一種:定義一個中間變數,使得兩個數值交換。第二種:利用兩個數值之間相互加減,使得兩個數值交換。第三種:利用異或運算,使得兩個數值交換。第一種方法程式碼如下: #include<stdio.h> int main() {
C語言:函式中引數的傳值與傳地址
任務程式碼: #include <stdio.h> void swap(int *a ,int *b)//按之前對指標認識,*a代表指標變數a,a儲存的是地址,*a是地址的值。 { //但是可以看到下面傳輸過程中swap(
C語言:最值問題
求最值問題 1.輸入n個整數,求最大值,最小值和平均值 #include<stdio.h> int main() { int i, avg = 0, max = 0, min = 0, n, k; printf("請
C語言:最值之差
題目: #include <stdio.h> int main() { int n,a[10000],i=0,max,min,t; scanf("%d",&n); while(scanf("%d",&a[i])!=EOF) i++; max=
C語言:最大值與最小值對調
題目: #include <stdio.h> int main() { int n,a[10000],i,max,min,t,x=0,y=0; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i])
c語言:根據輸入的分數,判斷其所在的等級,使用switch語句
#include<stdio.h> int main() { int score; char grade; printf("請輸入分數:"); scanf("%d",&score); int i; i=score/10; while(sco
C語言:利用指標編寫程式,定義一個3行3列的二維陣列,並在程式中對其進行賦值,陣列元素的型別不限,輸出該二維陣列以及各行的均值
題目來源:大工慕課 連結 作者:Caleb Sung 題目要求 利用指標編寫程式,定義一個3行3列的二維陣列,並在程式中對其進行賦值,陣列元素的型別不限,輸出該二維陣列以及各行的均值,各行
c語言:求多項式1-1/2+1/3-1/4+...+1/99-1/100的值,3種迴圈實現
方法一:for迴圈實現 程式: #include<stdio.h> int main() { double i = 0, t = 0,sum = 0,sign = -1; for (i =
C語言程式設計 計算程式執行時間 精確到微秒
在開發過程中有時候需要計算一段程式碼執行所消耗的時間 ,使用函式gettimeofday就可以實現,並且可以精確到毫秒 gettimeofday函式原型為: int gettimeofday(struct timeval *tv, struct timezone