1. 程式人生 > >演算法的樂趣c/c++ —— 1.1.2入門習題

演算法的樂趣c/c++ —— 1.1.2入門習題

宣告:摘選自“ 演算法競賽入門經典(第2版)”作者:  劉汝佳  /  陳鋒   ISBN:9787302291077

1,子序列的和(亞)

輸入兩個正整數n <m <106,輸出,保留5位小數。輸入包含多組資料,結束標記為n = m = 0.提示:本題有陷阱。樣例輸入:
2 4
65536 655360
0 0

案例輸出:
案例1:0.42361
案例2:0.00001

#include<stdio.h>
int main()
{
	int n, m;
	double sum;
	scanf("%d%d", &n, &m);
	for(int i=0; (i+n)<=m; i++)
	{
		sum += (double)1/((i+n)*(i+n));
	}
	printf("%.5f", sum);
	return 0;
}

2,分數化小數(小數) 

輸入正整數a,b,c,輸出a / b的小數形式,精確到小數點後c位.a,b≤106,c≤100。輸入包含多組資料,結束標記為a = b = c = 0 。

樣例輸入:
1 6 4
0 0 0
樣例輸出:
案例1:0.1667

#include<stdio.h>
int main()
{
	int a, b, c, Case=1;
	while(3 == scanf("%d%d%d", &a,&b,&c))
	{
		if(a==0 && b==0 && c==0) break;     //只要輸入三個數同時為0即停止運算
		int numb = a/b;                     //取整數部分
		a %= b;                             //取餘數 
		printf("Case %d %d.", Case++, numb);  //先列印整數部分加上一個小數點例如 1.  或者2. 
		for(int i=1; i<c; i++)
		{
			a *= 10;                        //取小數點後第i位 
			printf("%d", a/b);              //將小數點後第i位列印 
			a %= b;                         //取餘數 
		} 
		a *= 10;
		printf("%d\n", (a%b*10/b>5)?(a/b+1):(a/b)); //如果最後一位大於5,進位,否則不變 
	}
}