Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 简化分数_C - Fatal编程技术网

C 简化分数

C 简化分数,c,C,我已经编译了一个有理数数据库。整数用来表示有理数的分子和分母。可以执行减法、加法、乘法和除法。然而,在完成任务后,我并没有得到简单的答案。另外,1/2-1/2的答案是0/4,这很奇怪 我的代码: #include <stdio.h> int gcd(int a, int b) { if (a == 0) return b; return gcd(b % a, a); } int addFraction(int n1, int d1, int n2,

我已经编译了一个有理数数据库。整数用来表示有理数的分子和分母。可以执行减法、加法、乘法和除法。然而,在完成任务后,我并没有得到简单的答案。另外,
1/2-1/2
的答案是
0/4
,这很奇怪

我的代码:

#include <stdio.h>

int gcd(int a, int b) {
    if (a == 0)
        return b;
    return gcd(b % a, a);
}

int addFraction(int n1, int d1, int n2, int d2, int d3, int n3) { //Add
    d3 = gcd(d1, d2);
    d3 = (d1 * d2) / d3;
    n3 = (n1) * (d3 / d1) + (n2) * (d3 / d2);
    printf("\n %d/%d + %d/%d \t = \t %d/%d\n", n1, d1,n2, d2, n3, d3);
    return 0;
}

int subFraction(int n1, int d1, int n2, int d2, int d3, int n3) { //Subtract
    d3 = d1 * d2;
    n3 = (n1 * d2 - n2 * d1);
    printf("\n %d/%d - %d/%d \t = \t %d/%d\n", n1, d1, n2, d2, n3, d3);
    return 0;
}

int mulFraction(int n1, int d1, int n2, int d2, int d3, int n3) { //Multiply
    n3 = n1 * n2;
    d3 = d1 * d2;
    printf("\n %d/%d * %d/%d \t = \t %d/%d\n", n1, d1, n2, d2, n3, d3);
    return 0;
}

int divFraction(int n1, int d1, int n2, int d2, int d3, int n3) { //division
    n3 = n1 * d2;
    d3 = d1 * n2;
    printf("\n %d/%d / %d/%d \t = \t %d/%d\n", n1, d1, n2, d2, n3, d3);
    return 0;
}

int main() {
    int n1, d1, n2, d2, d3 = 0, n3 = 0;
    printf("\n Enter the values of numerator 1 and denominator 1: ");
    scanf("%d %d", &n1, &d1);
    printf("\n Enter the values of numerator 2 and denominator 2: ");
    scanf("%d %d", &n2, &d2);
    addFraction(n1, d1, n2, d2, d3, n3); //calling the function to perform addition of rational values
    subFraction(n1, d1, n2, d2, d3, n3); //calling the function to perform subtraction of rational values
    mulFraction(n1, d1, n2, d2, d3, n3); //calling the function to perform multiplication of rational values
    divFraction(n1, d1, n2, d2, d3, n3); //calling the function to perform division of rational values
    return 0;
}
#包括
内部gcd(内部a、内部b){
如果(a==0)
返回b;
返回gcd(b%a,a);
}
intaddfraction(intn1,intd1,intn2,intd2,intd3,intn3){//Add
d3=gcd(d1,d2);
d3=(d1*d2)/d3;
n3=(n1)*(d3/d1)+(n2)*(d3/d2);
printf(“\n%d/%d+%d/%d\t=\t%d/%d\n”,n1、d1、n2、d2、n3、d3);
返回0;
}
整数子分数(整数n1,整数d1,整数n2,整数d2,整数d3,整数n3){//减法
d3=d1*d2;
n3=(n1*d2-n2*d1);
printf(“\n%d/%d-%d/%d\t=\t%d/%d\n”,n1、d1、n2、d2、n3、d3);
返回0;
}
整数倍分数(整数n1,整数d1,整数n2,整数d2,整数d3,整数n3){//
n3=n1*n2;
d3=d1*d2;
printf(“\n%d/%d*%d/%d\t=\t%d/%d\n”,n1、d1、n2、d2、n3、d3);
返回0;
}
整数除法分数(整数n1,整数d1,整数n2,整数d2,整数d3,整数n3){//除法
n3=n1*d2;
d3=d1*n2;
printf(“\n%d/%d/%d/%d\t=\t%d/%d\n”,n1、d1、n2、d2、n3、d3);
返回0;
}
int main(){
int n1,d1,n2,d2,d3=0,n3=0;
printf(“\n输入分子1和分母1的值:”);
scanf(“%d%d”、&n1和&d1);
printf(“\n输入分子2和分母2的值:”);
scanf(“%d%d”、&n2和&d2);
addFraction(n1,d1,n2,d2,d3,n3);//调用函数执行有理值的加法
子分式(n1,d1,n2,d2,d3,n3);//调用函数执行有理值的减法
mulFraction(n1,d1,n2,d2,d3,n3);//调用函数以执行有理值的乘法
divFraction(n1,d1,n2,d2,d3,n3);//调用函数执行有理值的除法
返回0;
}
任何帮助都将不胜感激。

您需要对结果使用gcd函数,例如定义一个以简化形式打印分数的函数:

void printFraction(int numerator, int denominator)
{
    int d = gcd(numerator, denominator);
    int p = numerator / d;
    int q = denominator / d;
    printf("%d", p);
    if (q != 1) {
        printf("/%d", q);
    }
}
您还需要确保对scanf的调用成功,并且分母不为零。

您需要对结果使用gcd函数,例如,通过定义一个以简化形式打印分数的函数:

void printFraction(int numerator, int denominator)
{
    int d = gcd(numerator, denominator);
    int p = numerator / d;
    int q = denominator / d;
    printf("%d", p);
    if (q != 1) {
        printf("/%d", q);
    }
}

您还需要确保对scanf的调用成功,并且分母不为零。

代码中存在多个问题:

  • 函数应该使用指向结果分子和分母的指针
  • 您应该在计算其组件后减少结果分数
以下是修改后的版本:

#include <stdio.h>

int gcd(int a, int b) {
    if (a == 0)
        return b;
    return gcd(b % a, a);
}

void reduce(int n, int d, int *np, int *dp) {
    int dd = gcd(n, d);
    *np = n / dd;
    *dp = n / dd;
}

int addFraction(int n1, int d1, int n2, int d2, int *n3, int *d3) {
    reduce(n1 * d2 + n2 * d1, d1 * d2, n3, d3);
    printf("%d/%d + %d/%d \t = \t %d/%d\n", n1, d1, n2, d2, *n3, *d3);
    return 0;
}

int subFraction(int n1, int d1, int n2, int d2, int *n3, int *d3) {
    reduce(n1 * d2 - n2 * d1, d1 * d2, n3, d3);
    printf("%d/%d - %d/%d \t = \t %d/%d\n", n1, d1, n2, d2, *n3, *d3);
    return 0;
}

int mulFraction(int n1, int d1, int n2, int d2, int *n3, int *d3) {
    reduce(n1 * n2, d1 * d2, n3, d3);
    printf("%d/%d * %d/%d \t = \t %d/%d\n", n1, d1, n2, d2, *n3, *d3);
    return 0;
}

int divFraction(int n1, int d1, int n2, int d2, int *n3, int *d3) {
    reduce(n1 * d2, d1 * n2, n3, d3);
    printf("%d/%d / %d/%d \t = \t %d/%d\n", n1, d1, n2, d2, *n3, *d3);
    return 0;
}

int main() {
    int n1, d1, n2, d2, d3, n3;
    printf("Enter the values of numerator 1 and denominator 1: ");
    if (scanf("%d %d", &n1, &d1) != 2)
        return 1;
    printf("\n");
    printf("Enter the values of numerator 2 and denominator 2: ");
    if (scanf("%d %d", &n2, &d2) != 2)
        return 1;
    printf("\n");
    addFraction(n1, d1, n2, d2, &n3, &d3);
    subFraction(n1, d1, n2, d2, &n3, &d3);
    mulFraction(n1, d1, n2, d2, &n3, &d3);
    divFraction(n1, d1, n2, d2, &n3, &d3);
    return 0;
}
#包括
内部gcd(内部a、内部b){
如果(a==0)
返回b;
返回gcd(b%a,a);
}
void reduce(int n,int d,int*np,int*dp){
int-dd=gcd(n,d);
*np=n/dd;
*dp=n/dd;
}
整数加分数(整数n1、整数d1、整数n2、整数d2、整数n3、整数d3){
减少(n1*d2+n2*d1、d1*d2、n3、d3);
printf(“%d/%d+%d/%d\t=\t%d/%d\n”,n1、d1、n2、d2、*n3、*d3);
返回0;
}
整数子部分(整数n1、整数d1、整数n2、整数d2、整数n3、整数d3){
减少(n1*d2-n2*d1、d1*d2、n3、d3);
printf(“%d/%d-%d/%d\t=\t%d/%d\n”,n1、d1、n2、d2、*n3、*d3);
返回0;
}
整数倍分数(整数n1、整数d1、整数n2、整数d2、整数n3、整数d3){
减少(n1*n2,d1*d2,n3,d3);
printf(“%d/%d*%d/%d\t=\t%d/%d\n”,n1、d1、n2、d2、*n3、*d3);
返回0;
}
整数分数(整数n1、整数d1、整数n2、整数d2、整数n3、整数d3){
减少(n1*d2,d1*n2,n3,d3);
printf(“%d/%d/%d/%d\t=\t%d/%d\n”,n1、d1、n2、d2、*n3、*d3);
返回0;
}
int main(){
int n1、d1、n2、d2、d3、n3;
printf(“输入分子1和分母1的值:”);
如果(扫描频率(“%d%d”、&n1和&d1)!=2)
返回1;
printf(“\n”);
printf(“输入分子2和分母2的值:”);
如果(扫描频率(“%d%d”、&n2和&d2)!=2)
返回1;
printf(“\n”);
添加分数(n1、d1、n2、d2、n3和d3);
亚组分(n1、d1、n2、d2、n3和d3);
多组分(n1、d1、n2、d2、n3和d3);
二组分(n1、d1、n2、d2、n3和d3);
返回0;
}

您的代码中存在多个问题:

  • 函数应该使用指向结果分子和分母的指针
  • 您应该在计算其组件后减少结果分数
以下是修改后的版本:

#include <stdio.h>

int gcd(int a, int b) {
    if (a == 0)
        return b;
    return gcd(b % a, a);
}

void reduce(int n, int d, int *np, int *dp) {
    int dd = gcd(n, d);
    *np = n / dd;
    *dp = n / dd;
}

int addFraction(int n1, int d1, int n2, int d2, int *n3, int *d3) {
    reduce(n1 * d2 + n2 * d1, d1 * d2, n3, d3);
    printf("%d/%d + %d/%d \t = \t %d/%d\n", n1, d1, n2, d2, *n3, *d3);
    return 0;
}

int subFraction(int n1, int d1, int n2, int d2, int *n3, int *d3) {
    reduce(n1 * d2 - n2 * d1, d1 * d2, n3, d3);
    printf("%d/%d - %d/%d \t = \t %d/%d\n", n1, d1, n2, d2, *n3, *d3);
    return 0;
}

int mulFraction(int n1, int d1, int n2, int d2, int *n3, int *d3) {
    reduce(n1 * n2, d1 * d2, n3, d3);
    printf("%d/%d * %d/%d \t = \t %d/%d\n", n1, d1, n2, d2, *n3, *d3);
    return 0;
}

int divFraction(int n1, int d1, int n2, int d2, int *n3, int *d3) {
    reduce(n1 * d2, d1 * n2, n3, d3);
    printf("%d/%d / %d/%d \t = \t %d/%d\n", n1, d1, n2, d2, *n3, *d3);
    return 0;
}

int main() {
    int n1, d1, n2, d2, d3, n3;
    printf("Enter the values of numerator 1 and denominator 1: ");
    if (scanf("%d %d", &n1, &d1) != 2)
        return 1;
    printf("\n");
    printf("Enter the values of numerator 2 and denominator 2: ");
    if (scanf("%d %d", &n2, &d2) != 2)
        return 1;
    printf("\n");
    addFraction(n1, d1, n2, d2, &n3, &d3);
    subFraction(n1, d1, n2, d2, &n3, &d3);
    mulFraction(n1, d1, n2, d2, &n3, &d3);
    divFraction(n1, d1, n2, d2, &n3, &d3);
    return 0;
}
#包括
内部gcd(内部a、内部b){
如果(a==0)
返回b;
返回gcd(b%a,a);
}
void reduce(int n,int d,int*np,int*dp){
int-dd=gcd(n,d);
*np=n/dd;
*dp=n/dd;
}
整数加分数(整数n1、整数d1、整数n2、整数d2、整数n3、整数d3){
减少(n1*d2+n2*d1、d1*d2、n3、d3);
printf(“%d/%d+%d/%d\t=\t%d/%d\n”,n1、d1、n2、d2、*n3、*d3);
返回0;
}
整数子部分(整数n1、整数d1、整数n2、整数d2、整数n3、整数d3){
减少(n1*d2-n2*d1、d1*d2、n3、d3);
printf(“%d/%d-%d/%d\t=\t%d/%d\n”,n1、d1、n2、d2、*n3、*d3);
返回0;
}
整数倍分数(整数n1、整数d1、整数n2、整数d2、整数n3、整数d3){
减少(n1*n2,d1*d2,n3,d3);
printf(“%d/%d*%d/%d\t=\t%d/%d\n”,n1、d1、n2、d2、*n3、*d3);
返回0;
}
整数分数(整数n1、整数d1、整数n2、整数d2、整数n3、整数d3){
减少(n1*d2,d1*n2,n3,d3);
printf(“%d/%d/%d/%d\t=\t%d/%d\n”,n1、d1、n2、d2、*n3、*d3);
返回0;
}
int main(){
int n1、d1、n2、d2、d3、n3;
printf(“输入分子1和分母1的值:”);
如果(扫描频率(“%d%d”、&n1和&d1)!=2)
返回1;
printf(“\n”);
printf(“输入分子2和分母2的值:”);
如果(扫描频率(“%d%d”、&n2和&d2)!=2)
返回1;
printf(“\n”);
添加分数(n1,