C语言-同码小数和
設和式s(d,n)=0.d+0.dd+0.ddd+…+0.dd…d為n項同碼d小數之和,其中第k項小數點后有連續k個數字d(d=1,2,…,9)。
例如:s(7,4)=0.7+0.77+0.777+0.7777
還有其他的解法 可自行搜索 這個是我想的一種方法
#include<stdio.h> void main() {int j,d,n; //n項double t, s;printf("請輸入整數d,n:");scanf("%d%d", &d, &n);t = 1; s = 0;for (j = 1; j <=n; j++){t = t/ 10;s = s+(1 - t) / 9 * d;}printf(" s(%d,%d)=%.8f\n", d, n, s); }此處《至美——C語言程序設計》一書有,也轉載自https://blog.csdn.net/double_main/article/details/53404988?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160353992519725225001167%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=160353992519725225001167&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-53404988.first_rank_ecpm_v3_pc_rank_v2&utm_term=%E5%90%8C%E7%A0%81%E5%B0%8F%E6%95%B0&spm=1018.2118.3001.4187
設和式s(d,n)=0.d+0.dd+0.ddd+…+0.dd…d為n項同碼d小數之和,其中第k項小數點后有連續k個數字d(d=1,2,…,9)。
例如:s(7,4)=0.7+0.77+0.777+0.7777
1.說明:
輸入整數d,n(1<=d<=9,1<n<3000),計算并輸出同碼小數和s(d,n)(四舍五入精確到小數點后八位);
設置雙精度實變量s實施累加求和;
設置i(1~n)循環枚舉和式的每一項,設前項小數為t,則當前項顯然應為:t=t/10+(double)d/10
2.程序設計:
(1).循環設計求解;
```c#include<stdio.h>> void main() > { > int i,d,n; > double s,t; > printf("請輸入兩個整數d,n:"); > scanf("%d,%d",&d,&n); > s=t=0; /*t,s清零*/ > for(i=1;i<=n;i++) > { > t=t/10+(double)d/10; /*t為第i項小數*/ > s+=t; /*求和s*/ > } > printf("s(%d,%d)=%.8f\n",d,n,s); /*按公式輸出和s*/ > getch(); > } > > (2).省略循環設計求解; > > #include<stdio.h> > void main() > { > int d,n; > double s; > printf("請輸入兩個整數d,n:"); > scanf("%d,%d",&d,&n); > s=(n-0.111111111)*d/9; /*因輸出精確到小數點后八位,可取至小數點后九位*/ > printf("s(%d,%d)=%.8f\n",d,n,s); > getch(); > }(3).拓廣到任意指定同碼; 例如:s(2016,3)=0.2016+0.20162016+0.201620162016
輸入整數d,n(1<=d,n<3000),計算并輸出和s(d,n)(四舍五入精確到小數點后八位)。
#include<stdio.h>
void main()
{
int a,b,d,i,n;
double t,s;
printf(“請輸入兩個整數d,n:”);
scanf("%d,%d",&d,&n);
a=d;
b=1;
while(a>0)
{b*=10;a/=10;} /根據d計算b/
t=s=0;
for(i=1;i<=n;i++)
{
t=t/b+(double)d/b; /強制類型轉換/
s+=t;
}
printf(“s(%d,%d)=%.8f\n”,d,n,s);
getch();
}
3.程序運行示例及注意事項;
(1),(2)程序:請輸入兩個整數d,n:7,2017
s(7,2017)=1568.69135802(3)程序:請輸入兩個整數d,n:2017,1000
s(2017,1000)=201.72015184注意:事實上,一個簡單的案例都可以拓廣或引申到較為復雜的案例,而任何復雜的案例都可以追溯到一個簡單的案例。
上面并沒有實現8位數四舍五入,自己又續了一下。
#include<stdio.h> void main() { /* s(2016,3) = 0.2016 + 0.20162016 + 0.201620162016輸入整數d,n(1 <= d,n < 3000),計算并輸出和s(d,n)(四舍五入精確到小數點后八位)。*/int a, b, d, j, n;double t, s, t1;printf(" 請輸入第一個數作為同碼,逗號隔開,然后輸入第二個數作為重復次數");scanf_s("%d,%d", &d, &n);a = d; b = 1; //計數,計算d的位數while (a > 0){b = b * 10;a = a / 10; //根據d計算b,為遞推t做準備}t = s = 0;for (j = 1; j <= n; j++){t = t / b + (double)d / b; // 0.51+0.5151s += t; //求和s}t1 = 1.0;for (j = 1; j <=8; j++) //對第8位進行四舍五入 ( 啊){ t1 = t1 *10; } s = (longlong)(s * t1 + 0.5) / t1; //此處用int會超出范圍出錯printf(" s(%d,%d)=%0.8f\n", d, n, s); } ``````總結
- 上一篇: 分布式搜索 Elasticsearch
- 下一篇: [Leedcode][JAVA][第44