1. 程式人生 > >Bearox 程式設計之路

Bearox 程式設計之路

動態規劃做得好膩啊!但是前幾天的小測試,來了一個動態規劃,結果還是搞不出來。換換口味,就去做杭電的題目,結果wa的好久。好不爽啊,HDU1717挺有趣的一個題目,把小數轉換成分數。一直錯的測試資料是0.000(5)就是前面算出來是0的。

說一下迴圈小數轉換成分數的過程吧,這個在初中的時候有學過。

就是乘一個數然後剪掉迴圈部分,這個還是來看個例子你就能明白了:

比如

設x=0.32(67)    //()裡面的表示迴圈的部分

   n=0.32(67)*100 = 32.(67) //100是因為不迴圈部分有兩位。後面的67依舊迴圈。

   m=0.32(67)*10000 = 3267.(67) //10000是32和迴圈部分加起來有四位。67依舊迴圈。

接下去就很明瞭了m - n = x*(10000-100)  

x=(m-n)/(10000-100)

算出來以後不要忘記化簡,化簡其實就是求一下兩個數的最大公約數

下面是我的程式碼

#include<cstring>
#include<cstdio>

int n;
char str[30];
bool tt;

int gcd(int a, int b) 
{
	if(a == 0) return b;
    if(b % a == 0) return a;
    else
	return gcd(b % a, a);
}

int main()
{
    int i, j;
    int x, y;
    int k, p;
    scanf("%d", &n);
	while(n--)
	{
		getchar();
		scanf("%s", str);
		j = strlen(str);  tt = 0;
		for(i = 2; i < j; ++i)
		{
			if(str[i] == '('){
				tt = 1;
				break;
			}
		}
		if(tt == 0){
			x = str[2] - '0';  y = 10;
			for(i = 3; i < j; ++i)
				x = x * 10 + (str[i] - '0'), y *= 10;
		    j = gcd(x, y);
			printf("%d/%d\n", x / j, y / j);
		}
		else{
			x = 0; k = 1; i = 2;
			for( ; str[i] != '('; ++i)
				x = x * 10 + (str[i] - '0'), k *= 10;
			y = x;  p = k;
			for(++i; str[i] != ')'; ++i)
				y = y * 10 + (str[i] - '0'), p *= 10;
	    	y -= x;
	    	x = p - k;
			j = gcd(x, y);
			printf("%d/%d\n", y / j, x / j);
		}

    }
	return 0;
}