周練1
阿新 • • 發佈:2018-12-26
color space namespace num none return 全部 != names
7-1 N個數求和
寫了蠻久 我做水題的能力太差了 明天得把周練題目全部a了
還是有一個超時
#include <bits/stdc++.h> using namespace std; long gvs(long a,long b); int main() { int n;cin>>n; long a[105][2]; for(int i=1;i<=n;i++) { scanf("%ld/%ld",&a[i][0],&a[i][1]);//printf("1:%d/%d\n",a[i][0],a[i][1]);View Code} for(int i=1;i<=n-1;i++) { int g=gvs(a[i][1],a[i+1][1]); // printf("g=%d\n",g); a[i+1][0]=a[i+1][0]*(g/a[i+1][1]); //printf("%d\n",a[i+1][0]); a[i][0]=a[i][0]*(g/a[i][1]); //printf("%d\n",a[i][0]); a[i+1][0]+=a[i][0];//printf("%d\n",a[i+1][0]); a[i+1][1]=g;//printf("%d\n",a[i+1][1]); } //printf("%d/%d\n\n",a[n][0],a[n][1]); int f=0; if(a[n][0]<0){f=1;printf("-");a[n][0]=-a[n][0];} if(a[n][0]==0)printf("0"); long num=a[n][0]/a[n][1]; a[n][0]%=a[n][1]; if(num!=0&&a[n][0]!=0) printf("%d ",num); else if(num!=0)printf("%d",num); if(a[n][0]!=0) {for(int i=a[n][0];i>0;i--) { if(a[n][0]%i==0&&a[n][1]%i==0){if(f)printf("-"); printf("%ld/%ld",a[n][0]/i,a[n][1]/i); break;} } } return 0; } long gvs(long a,long b) { if(a>b){int t=a;a=b;b=t;} for(long i=a;;i+=a) { if(i%a==0&&i%b==0)return i; } }
看了別人的 最大公約數輾轉相除 快了很多
並且邊讀邊處理更加好
#include <stdio.h> long long gcd(long long a,long long b)//求最大公約數。 { if(a == 0) return 0; else return (b == 0) ? a : gcd(b, a % b); } int main() { int N; long long lcp;//用以記錄最小公倍數 long long a,b,c,d; int i = 1; scanf("%d",&N); scanf("%lld/%lld",&a,&b); int t0 = gcd(a,b); if(a) { a /= t0; b /= t0; } while(i < N) { scanf("%lld/%lld",&c,&d); lcp = b / gcd(b,d) * d;//通過最大公約數換算出兩個分母的最小公倍數 a = a * lcp / b + c * lcp / d;//通分後分子和 b = lcp; int t0 = gcd(a,b); if(t0 != 0)//從擴大最小公倍數之後的形式變換回來 { a = a / t0; b = b / t0; } i++; } if(a && a/b == 0)/// 整數部分為0 且 a不為 0 printf("%lld/%lld\n",a%b,b); else if(a%b == 0)/// 小數部分為0 printf("%lld\n",a/b); else printf("%lld %lld/%lld\n",a/b,a%b,b); return 0; }View Code
周練1