这个是题目
有部分测试例子结果是正确的,有一个运行超时,一个答案错误,求帮助
↓↓以下是出问题的代码↓↓
#include<stdio.h>
#include<math.h>
int main(){
int N;
char ch[100];
long long a[100],b[100],i;
scanf("%d",&N);
for(i=0;i<N;i++)
{
scanf("%lld",&a[i]);
scanf("%c",&ch[i]);
scanf("%lld",&b[i]);
}
long long n=labs(b[0]);
int m;
while(1){
m=0;
for(i=0;i<N;i++)
{
if(n%b[i]!=0){
m=1;
break;
}
}
if(m==0) break;
n++;
}
for(i=0;i<N;i++)
{
a[i]*=(n/b[i]);
b[i]*=(n/b[i]);
}
long long suma=0,sumb=b[0];
for(i=0;i<N;i++){
suma+=a[i];
}
long long k,max=(suma>=sumb)?suma:sumb;
for(i=max;i>0;i--){
if(suma%i==0&&sumb%i==0){
k=i;
break;
}
}
int j=0;
if(labs(suma)<labs(sumb)){
suma/=k;
sumb/=k;
printf("%lld/%lld\n",suma,sumb);
}
else if(suma%sumb==0&&labs(suma)>=labs(sumb)) printf("%d\n",suma/sumb);
else{
suma/=k;
sumb/=k;
for(i=0;i<n;i++){
if(suma<sumb){
printf("%d %lld/%lld\n",j,suma,sumb);
break;
}
suma-=sumb;
j++;
}
}
return 0;
}
有几个问题:
(1)while(1)这里,你应该是想求所有分母的公倍数,但是如果输入的数字相差比较大的话,很耗时
(2)第28行的for循环里,没必要对所有的b[i]相乘,只对b[0]处理即可了,这里也是一个耗时(虽然影响不大)
(3)题目要求如果是负数,负号在分子列,但是你的输出里没有这个处理
修改后运行结果:
代码修改如下:
#include<stdio.h>
#include<math.h>
//添加一个求公约数的函数
long long gys(long long a, long long b)
{
long long t,c;
if (a < b)
{
t = a;
a = b;
b = t;
}
c = a % b;
while (c != 0)
{
a = b;
b = c;
c = a % b;
}
return b;
}
int main() {
int N;
char ch[100];
long long a[100], b[100], i;
long long maxnmb; //修改1,记录所有分母的最大值
scanf("%d", &N);
for (i = 0; i < N; i++)
{
scanf("%lld", &a[i]);
scanf("%c", &ch[i]);
scanf("%lld", &b[i]);
//修改2 记录最大值
if (i == 0)
maxnmb = b[0];
else if (b[i] > maxnmb)
maxnmb = b[i];
//修改3 调整负号到分子
if (a[i] > 0 && b[i] < 0)
{
a[i] = -a[i];
b[i] = -b[i];
}
else if (a[i] < 0 && b[i] < 0)
{
a[i] = -a[i];
b[i] = -b[i];
}
}
long long n = maxnmb;//labs(b[0]); //修改4 从最大数开始找最小公倍数
//修改,这里去掉了中间变量m
while (1) {
for (i = 0; i < N; i++)
{
if (n % b[i] != 0) {
break;
}
}
if (i == N) break;
n++;
}
//修改 两个for循环合并
long long suma = 0, sumb;
for (i = 0; i < N; i++)
{
long long m = n / b[i];
a[i] *= m;
b[i] *= m;
suma += a[i]; //求和 放在这里就可以了
}
sumb = b[0];
//后面的处理太繁琐,修改如下:
char flag = '+';
if (suma < 0)
{
flag = '-';
suma = -suma;
}
long long zs = suma / sumb;
long long yushu = suma % sumb;
if (yushu == 0)
{
if (flag == '-')
printf("-%lld", zs);
else
printf("%lld", zs);
return 0;
}
//计算余数跟分母的公约数
long long yueshu = gys(sumb,yushu);
yushu /= yueshu;
sumb /= yueshu;
if (zs == 0)
{
if (flag == '-')
printf("-%lld/%lld", yushu, sumb);
else
printf("%lld/%lld", yushu, sumb);
}
else
{
if (flag == '-')
printf("-%lld -%lld/%lld", zs,yushu, sumb);
else
printf("%lld %lld/%lld",zs, yushu, sumb);
}
/*
for (i = 0; i < N; i++) {
suma += a[i];
}*/
/*
long long k, max = (suma >= sumb) ? suma : sumb;
for (i = max; i > 0; i--) {
if (suma % i == 0 && sumb % i == 0) {
k = i;
break;
}
}
int j = 0;
if (labs(suma) < labs(sumb)) {
suma /= k;
sumb /= k;
printf("%lld/%lld\n", suma, sumb);
}
else if (suma % sumb == 0 && labs(suma) >= labs(sumb)) printf("%d\n", suma / sumb);
else {
suma /= k;
sumb /= k;
for (i = 0; i < n; i++) {
if (suma < sumb) {
printf("%d %lld/%lld\n", j, suma, sumb);
break;
}
suma -= sumb;
j++;
}
}*/
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!