我的杭电ACM2028哪里错了
程序自己运行了几个例子都没问题,但是在杭电里用C语言提交上去就是WA……高手帮看下哪里出问题了……题目是求n个数的最小公倍数。输入包含多个测试实例,每个测试实例的开始是一...
程序自己运行了几个例子都没问题,但是在杭电里用C语言提交上去就是WA…… 高手帮看下哪里出问题了…… 题目是 求n个数的最小公倍数。 输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数。 为每组测试数据输出它们的最小公倍数,每个测试实例的输出占一行。你可以假设最后的输出是一个32位的整数。 PS.我main函数里的变量 j 是用来保存最后结果的,c是用来保存n个数的乘积的 #include<stdio.h> typedef unsigned long ul; int main() { int n; ul a,b,c,j; while(scanf("%lu",&n)!=EOF) { c=1; scanf("%lu %lu",&a,&b); c=a*b; a=gcd(a,b); n-=2; while(n--) { scanf("%lu",&b); c=c*b; a=gcd(a,b); } j=c/a; printf("%lu\n",j); } return 0; } ul gcd(ul a,ul b) { ul r; if(a<b){r=a;a=b;b=r;r=0;} xh: r=a%b; if(r==0)return b; else { a=b; b=r; } goto xh; }
展开
1个回答
展开全部
应该是精度问题,你那里写了 while(n--) { scanf("%lu",&b); c=c*b; //这里可能已经超出了32位的范围了 a=gcd(a,b); } 所以不能这样写,我是这样写的: #include <iostream> using namespace std ; int nlcm ( int * a , int n ); int lcm ( int a , int b ); int gcd ( int a , int b ); int main () { int i , n , z ; while ( cin >> n ) { int * a = new int [ n ]; for ( i = 0 ; i < n ; i ++) { cin >> a [ i ]; } cout << nlcm ( a , n )<< endl ; } return 0 ; } int nlcm ( int * a , int n ) { if ( n == 1 ) return * a ; else return lcm ( a [ n - 1 ], nlcm ( a , n - 1 )); } int lcm ( int a , int b ) { return a / gcd ( a , b )* b ; } int gcd ( int a , int b ) { int t ; if ( a < b ) { t = a ; a = b ; b = t ;}; if ( b == 0 ) return a ; else return gcd ( b , a % b ); } 希望你能满意我的回答。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询