問題 A: 分數矩陣
阿新 • • 發佈:2018-12-19
題目描述
我們定義如下矩陣:1/1 1/2 1/3
1/2 1/1 1/2
1/3 1/2 1/1
矩陣對角線上的元素始終是1/1,對角線兩邊分數的分母逐個遞增。
請求出這個矩陣的總和。
輸入
輸入包含多組測試資料。每行給定整數N(N<50000),表示矩陣為N*N。當N=0時,輸入結束。輸出
輸出答案,結果保留2位小數。樣例輸入
1
2
3
4
0
樣例輸出
1.00 3.00 5.67 8.83
這題就是一個規律題
#include<stdio.h> int main () { int n; int i; double sum;while(scanf("%d",&n),n) { sum=0; sum+=n*1; for (i=2;i<=n;i++) { sum+=1.0/i*(n-i+1)*2; } printf ("%.2f\n",sum); } return 0; }
用演算法筆記上的寫法時間超限了
#include<bits/stdc++.h> using namespace std; structFraction { int up,down;//分子 分母 //Fraction(){} Fraction(int _up=0,int _down=0):up(_up),down(_down){} }; int gcd(int a,int b) { if(b==0) return a; return gcd(b,a%b); } Fraction reduction(Fraction result)//分數的化簡 { if(result.down<0){//分母為負數,令分子和分母都變為相反數 result.down=-result.down; result.up=-result.up; } if(result.up==0) result.down=1;//如果分子為0 分母為1 else{//約去最大公約數 int d=gcd(abs(result.up),abs(result.down)); result.up/=d; result.down/=d; } return result; } int main() { int n; while(scanf("%d",&n)==1&&n!=0){ Fraction s[n*n+10]; for(int i=1;i<=n;i++){ s[n*(i-1)+i].up=1; s[n*(i-1)+i].down=1; } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i!=j){ if(j>i){ s[n*(i-1)+j].down=s[n*(i-1)+j-1].down+1; s[n*(i-1)+j].up=1; } } } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(j<i){ s[n*(i-1)+j].down=s[n*n+1-n*(i-1)-j].down; s[n*(i-1)+j].up=1; } } } Fraction c; c.down=s[1].down; c.up=s[1].up; for(int i=2;i<=n*n;i++){ c.up=s[i].up*c.down+c.up*s[i].down; c.down=s[i].down*c.down; c=reduction(c); cout<<c.up<<" "<<c.down<<endl; } printf("%.2f\n",1.0*c.up/c.down); } return 0; }
分數的四則運算就是我們正常的四則運算