C语言入门——多个数学问题求解

题目:
1. 一只老鼠咬坏了账本,公式中的符号 □ 代表被老鼠咬掉的地方。要想恢复下面的等式,应在□中填上哪个相同的数字?
3□ * 6237 = □3 * 3564
思路:利用穷举法找出该数字。

2.要求编制一个求方程ax2+bx+c=0的根的程序。一次可以求解多个方程的根,采用循环结构,当次循环输入一个方程的系数a、b和c,输出求出的根。求解时考虑四种情况:(1)系数a为0,不是二次方程。(2)方程有两个不同的实根。(3)方程有两个相同的实根。(4)方程有两个虚根。

3.一辆汽车撞人后逃跑。4个目击者提供如下线索:
甲:牌照三、四位相同; 乙:牌号为31XXXX;
丙:牌照五、六位相同; 丁:三~六位是一个整数的平方。
思路:为了从这些线索中求出牌照号码,只要求出后四位再加上310000即可。这四位又是前两位相同,后两位也相同,互相又不相同并且是某个整数的平方的数。可以仍然使用穷举法。由于1000的平方根大于31,循环可从31开始。

4.猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天都吃了前一天剩下的一半零一个。到了第10天早上再吃时,就只剩一个桃子了。求第一天共摘多少桃子。
思路:这里可以采用递推算法,设第10天的桃子数是x=1,则第9天的桃子数为(x+1)*2。共递推9次就可以得到第1天猴子所摘的桃子数。

5.打印以下钻石图案,要求任意输入行数(必须为奇数),图案被打印在屏幕的中心。例如行数为7的钻石图案如下:
          *
         ***
        *****
       *******
        *****
         ***
          *
思路:分为两部分,上面4行和下面3行,上面按行数递增,下面部分按行数递减。欲将图案输出在屏幕中心,通过计算可知每一行的左边应该有多少空格。

6.实现一个计算器。实现两个整数简单的加减乘除四则运算(假定除法为整除)。输入数据在文件express.txt中,计算结果写入另一个文件result.txt中,内容如下所示:
express.txt            result.txt
1+2                1+2=3
3-6                 3-6=-3
4*9                 4*9=36
9/2                 9/2=4
思路:打开数据文件express.txt,按顺序依次读入每行表达式中的两个运算量和一个运算符,根据运算符确定执行的是哪一种运算,计算后将结果在屏幕上显示,同时写入结果数据文件result.txt。

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

/*1.FIndNum函数,求出满足以下等式的数字, 
   3 □* 6237 = □3 * 3564 
*/ 
void FindNum()
{
    int i,find = 0;
    for(i=0; i<=9; i++)
    {
        if((30+i)*6237 == (i*10+3)*3564)
        { 
            printf("所求的数字为 %d, 3%d*6237 = %d3*3564\n",i,i,i);
            find = 1;
        } 
    }
    if(!find)
        printf("找不到满足等式的数字。\n");
} 

/* 一元二次方程求根 */ 
void FindRoot()
{
    int ch;
    double a, b, c, x1, x2; 
    while(1)
    {
        printf("按1继续,按0退出:\n");
        scanf("%d",&ch);
        if(ch == 0)
            break;
        else if(ch == 1)
        {
            printf("请分别输入a,b,c的值,以空格键分隔:\n");
            scanf("%lf%lf%lf",&a,&b,&c);

            //第一种情况:系数a为0,不是二次方程
            if(a == 0){
                x1 = -(c/b);
                printf("系数a为0,不是二次方程,方程的解为:%.2lf.\n",x1);
            }

            //第二种情况:方程有两个不同的实根 
            else if((b*b-4*a*c) > 0)
            {
                x1 = (-b+sqrt(b*b-4*a*c))/(2*a);
                x2 = (-b-sqrt(b*b-4*a*c))/(2*a);
                printf("方程有两个不同的实根,x1 = %.2lf, x2 = %.2lf. \n",x1,x2);
            }

            //第三种情况:方程有两个相同的实根 
            else if((b*b-4*a*c) == 0)
            {
                x1 = (-b)/(2*a);
                printf("方程有两个相同的实根, x1 = x2 = %.2lf.\n",x1);    
            }

            //第四种情况:方程有两个虚根 
            else
                printf("方程有两个虚根, x1 = %.2lf + %.2lf i, x2 = %.2lf - %.2lf i\n",
                (-b)/(2*a),sqrt(4*a*c-b*b)/(2*a),(-b)/(2*a),sqrt(4*a*c-b*b)/(2*a));
        }
    }
}

/*求出逃逸司机的车牌号,31XXXX,三、四位相同,五、六位相同,三~六位是一个整数的平方。
由于1000的平方根大于31,所以穷举循环从31开始。*/
void Detective()
{
    int i, num;
    int third, fourth, fifth, sixth;
    for(i=31; i<100; i++)
    {
        num = i*i;
        third = num / 1000;
        fourth = (num / 100) % 10;
        fifth = (num / 10) % 10;
        sixth = num % 10;

        if(third==fourth && fifth==sixth){
            printf("车牌号为%d。\n",310000+num);
            return;
        }
    }
    printf("未找到符合条件的车牌号。\n");
}

/*猴子吃桃问题,每天早上吃了前一天剩下的一半零一个桃子。
求第一天摘的桃子数*/
void Monkey()
{
    int day = 10;
    int peach = 1; 
    while(day>1)
    {
        day--;
        peach = (peach+1)*2;
    }
    printf("第一天猴子共摘了%d个桃子。\n",peach);
}

/*打印钻石被调用函数,根据图案规则套用循环*/
void Print_Diamond(int lines)
{
    int i,j;
    for(i=1; i<= lines; i++)
    {
        printf("                                  ");
        for(j=1; j<=abs(lines/2+1-i); j++)
            printf(" ");
        for(j=1; j<=lines-2*(abs(lines/2+1-i));j++)
            printf("*");
        printf("\n");           
    }
}

/*打印钻石图案,调用Print_Diamond函数,参数为行数*/
void Diamond()
{
    int lines;
    printf("请输入打印的钻石的行数(必须为奇数): ");
    scanf("%d",&lines);
     Print_Diamond(lines);
}

/*计算器,输入文件为express.txt,输出文件为result.txt*/ 
void Calculator()
{
    FILE *fin, *fout;
    int oprand1,oprand2,result; 
    char oprator;
    fin = fopen("express.txt","r");
    fout = fopen("result.txt","w");
    if(!fin)
    {
        printf("读入文件出错!\n");
        exit(0);
    }
    if(!fout)
    {
        printf("写入文件出错!\n");
        exit(0);
    }
    while((fscanf(fin,"%d%c%d",&oprand1,&oprator,&oprand2))!=EOF)
    {
        switch(oprator)
        {
            case '+':
                result = oprand1 + oprand2;
                fprintf(fout,"%d%c%d=%d\n",oprand1,oprator,oprand2,result);
                break;
            case '-':
                result = oprand1 - oprand2;
                fprintf(fout,"%d%c%d=%d\n",oprand1,oprator,oprand2,result);
                break;
            case '*':
                result = oprand1 * oprand2;
                fprintf(fout,"%d%c%d=%d\n",oprand1,oprator,oprand2,result);
                break;
            case '/':
                result = oprand1 / oprand2;
                fprintf(fout,"%d%c%d=%d\n",oprand1,oprator,oprand2,result);
                break;
        }
    }
    fclose(fin);
    fclose(fout);
}



int main()
{
    int choice;

    while(1)
    {
        printf("------------MENU----------------\n");
        printf("           1.FindNum            \n");
        printf("           2.FindRoot           \n");
        printf("           3.Detective          \n");
        printf("           4.Monkey             \n");
        printf("           5.Diamond            \n");
        printf("           6.Calculator         \n");
        printf("           0.GoodBye!           \n");
        printf("Please input your choice: ");
        scanf("%d",&choice);
        switch(choice)
        {
            case 1:
                FindNum();
                break;
            case 2:
                FindRoot();
                break;
            case 3:
                Detective();
                break;
            case 4:
                Monkey();
                break;
            case 5:
                Diamond();
                break;
            case 6:
                Calculator();
                break;
            case 0:
                printf("再见,谢谢使用!\n");
                exit(0);

        }   
    }

    return 0;
} 
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页