/*一个整数,它加上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);
}
}
1645c-exercise-example3
参考方法:
1644c-exercise-example3
参考方法:
1643c-exercise-example3
参考方法:
1642c-exercise-example3
参考方法:
1641c-exercise-example3
参考方法: