``有一位阿拉伯老人,生前养有11匹马,他去世前立下遗嘱:大儿子、二儿子、小儿子分别继承遗产的1/2、1/4、1/6。 儿子们想来想去没法分:他们所得到的都不是整数,即分别为11/2、11/4、11/6,总不能把一匹马割成几块来分吧? 聪明的邻居牵来了自己的一匹马,对他们说:“你们看,现在有12匹马了,老大得12匹的1/2就是6匹,老二得12匹的1/4就是3匹, 老三得12匹的1/6就是2匹,还剩一匹我照旧牵回家去。”这样把难分的问题解决了。 现在又有一个老人要分遗产了,他有m匹马(1≤m≤1000000),并且有n个儿子(1≤n≤10),每个儿子分别得到1/a1、1/a2、…、1/an的遗产。 因为马不能分割,并且遗产要全部分完,所以请你用上面那位聪明的邻居的方法计算一下每个儿子能分到几匹马。 输入描述: 输入包括多组测试数据。 每组测试数据包括两行: 第一行为m、n,分别代表老人拥有的马匹数和几个儿子。 第二行有n个数据a1、a2、…、an,依次代表大儿子、二儿子…第n个儿子分到的遗产的份额。(0 < ai < 50) 程序以输入0 0结束,该行不做处理。 输出描述: 按照上面介绍的方法解决这个问题。 如果那种方法不能解决这个问题(即所有儿子不能得到整数匹马),则你的程序要输出"Can’t Solve"; 否者依次输出大儿子、二儿子…得到的马的匹数。 每个数之间有一个空格隔开(最后一个数据后面没有空格)。 示例1 输入 11 3 2 4 6 2 2 3 3 0 0 输出 6 3 2 1 1 思路:该题就是求多个数的最小公倍数,用了辗转相除法求了最大公约数 注意:这题是牛客网中的题,我不知道为啥交上去不能通过,要是哪位大神知道为啥,拜托您跟我讲讲我哪错了,谢谢啦!
#include <iostream> #include<stdio.h> #include<stdlib.h> #include<math.h> using namespace std; int n,m,a[51]; int f(int x,int y) { int r,a,b; a=x; b=y; while((r=a%b)&&r!=0)//辗转相除求最大公约数 { a=b; b=r; } return (x*y)/b;//最小公倍数 } int main() { int s; while(cin>>m>>n&&n!=0&&m!=0) { for(int i=0;i<n;i++) scanf("%d",&a[i]); s=f(a[0],a[1]); for(int j=2;j<n;j++) { s=f(s,a[j]); } if(s<m) { cout<<"Can't Solve"<<endl; } else { for(int i=0;i<n;i++) printf("%d ",s/a[i]); } printf("\n"); } return 0; }