我只会用二分枚举,即sum(1,mid-1) == sum(mid+1, n) -->2*pow(mid, 2) == n*(n+1); 然后去网上看了看其他人是用打表的方式过去的,今天第一次接触了暴力打表。
共同进步啊。
由于我不知道最大数是多少,于是我将n的范围开到了一亿,反正也只要前十组,如果少了就增加n的范围。
打表CODE:
#include<stdio.h>
#include< string.h>
int main()
{
freopen( " UVA138.cpp ", " w ", stdout);
long long int i, j, x, mid, y;
printf( " #include <cstdio>\n ");
printf( " int main()\n ");
printf( " {\n ");
for(i = 6; i <= 100000000; i++)
{
x = 1;
y = i+ 1;
for(;;)
{
mid = (x+y)/ 2;
if(mid == x) break;
if(mid*mid* 2 > i*(i+ 1))
{
y = mid;
}
else x = mid;
}
if(mid * mid * 2 == i * (i + 1))
printf( " \tprintf(\"%10lld%10lld\\n\");\n ", mid, i);
}
printf( " }\n ");
return 0;
}
#include< string.h>
int main()
{
freopen( " UVA138.cpp ", " w ", stdout);
long long int i, j, x, mid, y;
printf( " #include <cstdio>\n ");
printf( " int main()\n ");
printf( " {\n ");
for(i = 6; i <= 100000000; i++)
{
x = 1;
y = i+ 1;
for(;;)
{
mid = (x+y)/ 2;
if(mid == x) break;
if(mid*mid* 2 > i*(i+ 1))
{
y = mid;
}
else x = mid;
}
if(mid * mid * 2 == i * (i + 1))
printf( " \tprintf(\"%10lld%10lld\\n\");\n ", mid, i);
}
printf( " }\n ");
return 0;
}
CODE:
#include <cstdio>
int main()
{
printf( " 6 8\n ");
printf( " 35 49\n ");
printf( " 204 288\n ");
printf( " 1189 1681\n ");
printf( " 6930 9800\n ");
printf( " 40391 57121\n ");
printf( " 235416 332928\n ");
printf( " 1372105 1940449\n ");
printf( " 7997214 11309768\n ");
printf( " 46611179 65918161\n ");
}
int main()
{
printf( " 6 8\n ");
printf( " 35 49\n ");
printf( " 204 288\n ");
printf( " 1189 1681\n ");
printf( " 6930 9800\n ");
printf( " 40391 57121\n ");
printf( " 235416 332928\n ");
printf( " 1372105 1940449\n ");
printf( " 7997214 11309768\n ");
printf( " 46611179 65918161\n ");
}