C 中使用结构减少有理数的函数

问题描述 投票:0回答:2
#define TRUE 1

#define FALSE 0

struct rational{         
    int numerator;    
    int denominator;    
};       
void reduce(struct rational *inrat,struct rational *outrat)    
{    
    int a,b,rem;        
    if(inrat->numerator>inrat->denominator)      
    {   
        a=inrat->numerator;
        b=inrat->denominator;    
    }        
    else    
    {    
        b=inrat->numerator;
        a=inrat->denominator;
    }
    while(b!=0)
    {
        rem=a%b;
        a=b;
        b=rem;
    }
    outrat->numerator/=a;      
    outrat->denominator/=a;     
}  

好的,这是一个减少有理数的代码。 它基于欧几里得算法。
我的问题是,如果所有数据都通过

outrat
存储在变量中(当然是在主函数中),那么指向结构
intrat
的指针有什么用处。 为什么使用这样的说法
outrat->numerator/=a; outrat->denominator/=a;
如果通过
intrat
指针操作实际值,为什么要使用
outrat

c data-structures
2个回答
2
投票

我对算法不太了解,但是看代码,

inrat
是输入,
outrat
是输出有理数。

这些值通过

inrat
操纵。
inrat
的值用于计算除数,然后将其应用于
outrat
。 所以实际被操纵的是
outrat
的值。

实际上,为了清楚起见,该函数应该用

inrat
声明为
const


0
投票

这是减少有理数的 C++ 代码,在 C 中尝试相同的逻辑:

#include<iostream>
using namespace std;
struct rational {
       int numerator;
       int denominator;
};
/*struct rational *inputrational  : Actual rational number to be reduced
struct rational *outputrational : Variable to store the rational number in its lowest form */
void reduce(struct rational *inputrational, struct rational *outputrational) {
    //Write your solution code below this line
    int n,m,i=2,min;
     n=inputrational->numerator;
     m=inputrational->denominator;
     min=n>m?m:n;
     for(i=m;i>0;i--){
          if(n%i==0 && m%i==0){
             n=n/i;
            m=m/i;
            break;
            }
        }

    outputrational->numerator=n;
    outputrational->denominator=m;


  }

int main(){
    rational n1,s1;
    n1.numerator=13;
    n1.denominator=6;
    reduce(&n1,&s1);
     cout<<s1.numerator<<" "<<s1.denominator;
}
© www.soinside.com 2019 - 2024. All rights reserved.