#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
?
我对算法不太了解,但是看代码,
inrat
是输入,outrat
是输出有理数。
这些值不通过
inrat
操纵。 inrat
的值用于计算除数,然后将其应用于 outrat
。 所以实际被操纵的是 outrat
的值。
实际上,为了清楚起见,该函数应该用
inrat
声明为 const
。
这是减少有理数的 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;
}