C 语言教程 在线

1645c-exercise-example3

参考方法:

/*一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?*/
/*依据x+100=b^2 x+268=a^2得(a-b)(a+b)=168分解因式检验即可*/
#include<stdio.h>
int main(void)
{
    int i = 1;
    int a, b, n;
    for (i = 1; i*i <= 168; i++)
    {
        if (!(168 % i))
        {
            a = (i + 168 / i) / 2;
            b = (168 / i - i) / 2;
                        n = a*a - 268;
            if ((a*a - 268) == (b*b - 100))
                printf("The correct answer is %d.\n", n);
        }
    }
    return 0;
}

1644c-exercise-example3

参考方法:

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

int main()
{
    int a,x;    // x 为该整数,x+100 可被 a 开平方;
    double b;   // x+268 可被 b 开平方;
    for(a=0;b*b-(b-1)*(b-1)<168;a++)  // a*a 最小值为 0,故 a 取值从 0 开始,需满足 b*b-(b-1)*(b-1)<168,否则不存 在a*a +168=b*b
    {
        b=sqrt(a*a+168);
        if    ( b==(int)b ) {
            x=a*a-100;  
            printf("x=%d a=%d b=%f\n",x,a,b);  
        }
    }
}

1643c-exercise-example3

参考方法:

#include <stdio.h>

/*
    x + 100 = m^2;
    x + 268 = n^2;
    x∈Z,m,n∈Z+;
    (m+n)(m-n)=168=2*2*2*3*7
    =2*84=4*42=6*28=12*14
    数论问题:奇偶分析、因式分解
    计算机优化整数搜索空间:枚举法
    i*j=168,m=(i+j)/2,n=(j-i)/2,i<j
    for i∈[2,84]
    for i∈[2,12],13^2=169>168
*/
// bit field
struct
{
    unsigned int i: 4;
    unsigned int j: 7;
    unsigned int n: 6;
    int x: 12;
}num;

int main()
{
    for(num.i=2; num.i<=12; num.i++)
    {
        if(168%num.i==0)
        {
            num.j = 168/num.i;
            if(num.i%2==0 && num.j%2==0)
            {
                num.n = (num.i+num.j)/2;
                num.x = num.n*num.n-268;
                printf("i=%d,x=%d\n",num.i,num.x);
                printf("%lu",sizeof(num));
            }
        }
    }
    return 0;
}

1642c-exercise-example3

参考方法:

#include <stdio.h>

/*
    一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
    x + 100 = m^2;
    x + 268 = n^2;
    x∈Z,m,n∈Z+;
    (m+n)(m-n)=168=2*2*2*3*7 <因式分解>
    =2*84=4*42=6*28=12*14
    数论问题:奇偶分析
    计算机优化整数搜索空间:枚举法
    i*j=168,m=(i+j)/2,n=(i-j)/2,i>j
    for i∈[2,84]
    for i∈[2,12],13^2=169>168
*/

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

1641c-exercise-example3

参考方法:

#include <stdio.h>

int main() {
    int m, n;
    int j;
    for ( int i = 1;  i < 168;  i++)
    {
        j = 168 / i;
        if (j > i || 168 % i != 0)
        {
            continue;
        }

        if ((i + j) % 2 != 0 || (i - j) % 2 != 0)
        {
            continue;
        }

        m = (i + j) / 2;
        n = (i - j) / 2;
        printf("m和n分别是:%d,%d,", m, n);
        printf("这个数是:%d\n", n * n - 100);
    }
}