1. 程式人生 > >問題 A: 分數矩陣

問題 A: 分數矩陣

題目描述

我們定義如下矩陣:
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;
struct
Fraction { 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; }

 

 

分數的四則運算就是我們正常的四則運算