C 语言教程 在线

1640c-exercise-example3

/*
  思路:
    1.根据已知条件判断该整数 x 的上下限
        由已知条件得
            sqrt(x + 100) = y    由 y>=0 可知 x 的下限即为 -100
            sqrt(x + 268) = z
        由上面两式可得
            z^2 - y^2 = 168
        按照两个相邻整数的平方差间隔越来越大的特性,找出极限情况下的数值 y 与 z
        将 z^2 - 268 或 y^2 - 100 作为 x 的上限
    2.然后在范围内暴力搜索,找出所有符合描述的值
        根据 x 的值计算 y, z
        判断 y, z 均为整数,即输出 x
*/

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

int main()
{
    int x, c1, c2, L, H;
    c1 = 100;
    c2 = 168;

    L = -c1;

    int i = 0;    
    for (i = 1; i*i - (i - 1)*(i - 1) <= c2; ++i)
        ;

    H = i*i - (c1 + c2);

    int j;
    double y, z;
    for (j = L; j <= H; ++j)
    {
        y = sqrt(j + c1);
        z = sqrt(j + c1 + c2);
        if (y == (int)y && z == (int)z)
            printf("x的值为 %d\n", j);
    }

    return 0;
}

输出结果为:

x的值为 -99
x的值为 21
x的值为 261
x的值为 1581

1639c-exercise-example3

思路:

由 m^2 - n^2 = (m + n)(m - n) = 168, 得到 |m|>|n|

上式中 |n| 最大时则有:(n+1)^2-n^2≥168 → n≥83.5 , 故选择n的取值范围为1~84,

此时,x=n^2-100, m=(x+268)^0.5, 只需求得每个n所对应的x与m,再从中选择整型的x与m进行输出即可

程序:

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

int main()
{
    int n,x,a,m;
    double b;

    for (n = 1; n <= 168 / 2 ; n++)
    {
        x=n*n-100;
        a=x+268;
        b=sqrt(a);
        if((int)b==b)
        {
            m=(int)b;
            printf ("%d + 100 = %d * %d\n", x, n, n);
            printf ("%d + 268 = %d * %d\n", x, m, m);
        }
    }
    return 0;
}

1638c-exercise-example3

优化,有两点多余,i 可以从 2 开始加 2,i-j 必定是偶的:

#include <stdio.h>

int main (void)
{
    int  i, j, m, n, x;
    for (i = 2; i <= 168 / 2; i=i+2)
    {
        if (168 % i == 0)
        {
            j = 168 / i;
            if ( i > j && (i + j) % 2 == 0)
            {
                m = (i + j) / 2;
                n = (i - j) / 2;
                x = n * n - 100;
                printf ("%d + 100 = %d * %d\n", x, n, n);
                printf ("%d + 268 = %d * %d\n", x, m, m);
            }
        }
    }
    return 0;
}

1637c-exercise-example2

参考方法:

#include <stdio.h>

#define MAX_ARRAY_PROFIT 6  
const double profit1[MAX_ARRAY_PROFIT]={0,100000,200000,400000,600000,1000000};
const double percent[MAX_ARRAY_PROFIT]={0.1,0.075,0.05,0.03,0.015,0.01};

int main()
{
    unsigned char i;
    double p;
    double bonus;
    printf("你的净利润是:\n");
    scanf("%lf",&p);

    for(i=0,bonus=0;i<MAX_ARRAY_PROFIT-1;i++)
    {
        if(p>profit1[i] && p<profit1[i+1]) {
            bonus +=(p-profit1[i])*percent[i];
        }

        if(p>=profit1[i+1]){
            bonus +=(profit1[i+1]-profit1[i])*percent[i];
        }
    }

    if(p>=profit1[MAX_ARRAY_PROFIT-1]){
        bonus +=(p-profit1[MAX_ARRAY_PROFIT-1])*percent[MAX_ARRAY_PROFIT-1];
    }
    printf("提成为:bonus=%lf",bonus);
    printf("\n");
    return 0;
}

1636c-exercise-example2

笔记2进行更正:

#include<stdio.h>
int main(){
    int i;
    double lirun;
    double a;
    double jiangjin = 0;
    float ticheng[] = {0,0.1, 0.075, 0.05, 0.03, 0.015, 0.01};    
    printf("您好,请问您的净利润是多少?\n");
    scanf("%lf", &lirun);
    a=lirun;
    float fanwei[] = {0,100000, 200000, 400000, 600000, 1000000, a};
    for (i=1;i<7;i++) {
        if (a < fanwei[i]){
        jiangjin += lirun * ticheng[i];
            break;        
        }       
        else   
        {       
            jiangjin += (fanwei[i]-fanwei[i-1]) * ticheng[i];  
            lirun -= fanwei[i];    
        }
    }  
    printf("奖金是%.2lf\n", jiangjin);

    return 0;
}