zoukankan      html  css  js  c++  java
  • 有理数均值

    个人观点,如有不同见解,欢迎留言

    题目:

    本题要求编写程序,计算N个有理数的平均值。

    输入格式:

    输入第一行给出正整数N(le100);第二行中按照a1/b1 a2/b2 …的格式给出N个分数形式的有理数,其中分子和分母全是整形范围内的整数;如果是负数,则负号一定出现在最前面。

    输出格式:

    在一行中按照a/b的格式输出N个有理数的平均值。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。

    输入样例1:

    4
    1/2 1/6 3/6 -5/10
     

    输出样例1:

    1/6
     

    输入样例2:

    2
    4/3 2/3
     

    输出样例2:

    1
     

    代码:

    #include<iostream>
    #include<cmath>
    #define len  20
    int LCM(int x,int y);
    int GCD(int x,int y);
    using namespace std;
    int main() {
    	int n;
    	cin>>n;
    	char a[n][len];
    	int num[n][2]= {0},lcm=1,numerator=0,lcm_;
    	for(int i=0; i<n; i++)
    		cin>>a[i];
    	for(int i=0; i<n; i++) {               //将字符串转化为分子和分母
    		for(int j=0; a[i][j]!=''; j++) {
    			if(a[i][j]=='/') {
    				int flag=1;
    				if(a[i][0]=='-') {
    					for(int k=j-1; k>0; k--) {
    						num[i][0]+=(a[i][k]-'0')*flag;
    						flag*=10;
    					}
    					num[i][0]=-num[i][0];
    				} else {
    					for(int k=j-1; k>=0; k--) {
    						num[i][0]+=(a[i][k]-'0')*flag;
    						flag*=10;
    					}
    				}
    			}
    			if(a[i][j+1]=='') {
    				int flag=1;
    				for(int k=j; a[i][k]!='/'; k--) {
    					num[i][1]+=(a[i][k]-'0')*flag;
    					flag*=10;
    				}
    			}
    		}
    	}
    	if(n==1) {
    		int temp3=GCD(num[0][0],num[0][1]);
    		num[0][0]/=temp3;
    		num[0][1]/=temp3;
    		//cout<<temp3<<"***";
    		numerator=num[0][0];
    		lcm=num[0][1];
    		//cout<<num[0][0]<<"**"<<num[0][1]<<"***";
    
    	} else {
    
    		for(int i=0; i<n-1; i++) {                     //求分母最小公倍数(lcm)
    
    			if(lcm%num[i+1][1]!=0) {
    				lcm=LCM(num[i][1],num[i+1][1]);
    			}
    		}
    		for(int i=0; i<n; i++) {                        //求通分后的分子(numerator)
    			numerator+=lcm/num[i][1]*num[i][0];
    		}
    		lcm*=n;
    		int temp1=GCD(abs(numerator),lcm);              //分子分母化简
    		numerator/=temp1;
    		lcm/=temp1;
    	}
    	cout<<numerator;
    	if(lcm!=1)
    		cout<<"/"<<lcm;
    }
    int LCM(int x,int y) {                 //求两个数最小公倍数
    	return x*y/GCD(x,y);
    }
    int GCD(int x,int y) {                  //求两个数最大公约数
    	int x_temp=x,y_temp=y;
    	while(1) {
    		if(!y)
    			break;
    		else {
    			int temp=x%y;
    			x=y;
    			y=temp;
    		}
    	}
    	return x;
    }
    

    注:

    一个测试点没过

  • 相关阅读:
    CocoStudio基础教程(4)骨骼动画的动态换肤
    CocoStudio基础教程(3)在程序中处理cocoStudio导出动画
    CocoStudio基础教程(2)关联程序逻辑与cocoStudio导出文件
    CocoStudio基础教程(1)创建UI并载入到程序中
    LeetCode:盛最多水的容器【11】
    LeetCode:反转字符串中的元音字母【345】
    LeetCode:验证回文串【125】
    LeetCode:颜色分类【75】
    LeetCode:删除排序数组中的重复项||【80】
    LeetCode:移动零【283】
  • 原文地址:https://www.cnblogs.com/pluie/p/12811806.html
Copyright © 2011-2022 走看看