
C语言分式连乘问题,求简化+可以输入很大很大的数字
以下是我的代码#include<stdio.h>intmain(){inta,b,c,d,e,f,i,n,x,y;scanf("%d",&n);x=1;y=1;//输入的...
以下是我的代码
#include<stdio.h>
int main()
{
int a,b,c,d,e,f,i,n,x,y;
scanf("%d",&n);x=1;y=1; //输入的n代表有n个分式相乘
for(i=1;i<=n;i++)
{
scanf("%d%d",&a,&b);
x=x*a;
y=y*b;
}
if(x>y) /*
for(c=y;c>0;c--) 这里整个
{ 是
if(x%c==0&&y%c==0) 我
{d=x/c;e=y/c;break;} 的
} 最
if(y>x) 大
for(c=x;c>0;c--) 公约数
{ 求法,程序超时应该是这里,求改成
if(x%c==0&&y%c==0) 用辗转相处法,两个数是x,y,c为最大
{d=x/c;e=y/c;break;} 公约数
} */
f=d/e;
if(d>=e)
{if(d%e!=0)
printf("%d/%d\n",d,e);
else
printf("%d\n",f);}
if(d<e)
{if(d%e!=0)
printf("%d/%d\n",d,e);
else
printf("%d\n",f);}
return 0;
}
还有就是需要输很大的数字,long都不够,但VC6.0又不能用long long,不知道该怎么改。。。
反正求各位大神了!!感激不尽,就俩问题,一个简化,一个能输入很大很大的数!谢谢!各位大大!!! 展开
#include<stdio.h>
int main()
{
int a,b,c,d,e,f,i,n,x,y;
scanf("%d",&n);x=1;y=1; //输入的n代表有n个分式相乘
for(i=1;i<=n;i++)
{
scanf("%d%d",&a,&b);
x=x*a;
y=y*b;
}
if(x>y) /*
for(c=y;c>0;c--) 这里整个
{ 是
if(x%c==0&&y%c==0) 我
{d=x/c;e=y/c;break;} 的
} 最
if(y>x) 大
for(c=x;c>0;c--) 公约数
{ 求法,程序超时应该是这里,求改成
if(x%c==0&&y%c==0) 用辗转相处法,两个数是x,y,c为最大
{d=x/c;e=y/c;break;} 公约数
} */
f=d/e;
if(d>=e)
{if(d%e!=0)
printf("%d/%d\n",d,e);
else
printf("%d\n",f);}
if(d<e)
{if(d%e!=0)
printf("%d/%d\n",d,e);
else
printf("%d\n",f);}
return 0;
}
还有就是需要输很大的数字,long都不够,但VC6.0又不能用long long,不知道该怎么改。。。
反正求各位大神了!!感激不尽,就俩问题,一个简化,一个能输入很大很大的数!谢谢!各位大大!!! 展开
2个回答
展开全部
你每次乘以一个新的分式之后就进行约分,使你的分式始终保持最简形式,则就可以不需要大整数了。如果实在要用的话VC6.0也可以用64位的整数啊,不过它是用_int64表示(无需添加任何特殊头文件),输出格式则为printf(“%I64d", ...); 例如
_int64 a = 98765432198765 * 2;
printf("%I64d", a);
不用大整数,程序则可如下做
#include <stdio.h>
int gcd(int x, int y) {
int m, n;
m = ((x > y) ? x : y);
n = ((x <= y) ? x : y);
if(m % n == 0) return n;
else return gcd(n, m % n);
}
void main( )
{
int a, b, c, x, y, n, i;
scanf("%d", &n);
x = 1; y = 1;
for(i = 0; i < n; i++) {
scanf("%d%d", &a, &b);
x *= a;
y *= b;
c = gcd(x, y);
x /= c;
y /= c;
}
if(y != 1) printf("%d/%d\n", x, y);
else printf("%d\n", x);
}
_int64 a = 98765432198765 * 2;
printf("%I64d", a);
不用大整数,程序则可如下做
#include <stdio.h>
int gcd(int x, int y) {
int m, n;
m = ((x > y) ? x : y);
n = ((x <= y) ? x : y);
if(m % n == 0) return n;
else return gcd(n, m % n);
}
void main( )
{
int a, b, c, x, y, n, i;
scanf("%d", &n);
x = 1; y = 1;
for(i = 0; i < n; i++) {
scanf("%d%d", &a, &b);
x *= a;
y *= b;
c = gcd(x, y);
x /= c;
y /= c;
}
if(y != 1) printf("%d/%d\n", x, y);
else printf("%d\n", x);
}
追问
呜呜!我就是那样弄得!结果作业提交区不识别……………………快崩溃了!简化已经OK
追答
那可能是你要考虑负分数的情况,如果是这样则将程序改为
#include
#include
int gcd(int x, int y) {
int m, n;
m = ((x > y) ? x : y);
n = ((x <= y) ? x : y);
if(m % n == 0) return n;
else return gcd(n, m % n);
}
void main( )
{
int a, b, c, x, y, absx, n, i;
scanf("%d", &n);
x = 1; y = 1;
for(i = 0; i < n; i++) {
scanf("%d%d", &a, &b);
x *= a;
y *= b;
if(y < 0) y = -y, x = -x;
absx = abs(x);
c = gcd(absx, y);
x /= c;
y /= c;
}
if(y != 1) printf("%d/%d\n", x, y);
else printf("%d\n", x);
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询