UVA 138(数论)

题意:

有一个计算机程序员,她家所在的某条路上的住宅都在路的同一边,编号由1开始依次递增。她每天晚上都要出门溜狗,或向左走或向右走,直到街尾后返回。有一天溜狗时她计算了沿街的门牌号之和(不包括她家的),第二天她走了相反的方向也计算了门牌号之和,结果令她震惊——两次门牌号之和竟然相同。尽管这个结果是由沿街的房子数量以及她家的门牌号决定的,但她仍然觉得这非常奇妙,并决定将此作为以后选择住房的必要条件。
写一个程序来计算满足上述条件的参数。参数包含两个整数,第一个是她的房子的门牌号,第二个是最后一个房子门牌号。
输出前10个能满足上面条件的整数对,每对整数独占一行,每个整数都居右对齐,宽度为10个字符。

解析:

1 + 2 + … + (k – 1) = (k + 1) + (m + 2) + … + (n)
(k – 1)[1 + (k – 1)] / 2 = (n – k)[(k + 1) + n] / 2, 两边同乘以2
(k – 1)[1 + (k – 1)] = (n – k)[(k + 1) + n] (2)
将(2)再次化简,得到:
2k^2 = n^2 + n
所以 k = sqrt(n*(n+1)/2)
枚举n的值,从而判断所得到的k值是否为整数,若为整数则说明两边的值实际相等。
得到输出满足条件的最小的十组k、n。

注意:

格式“%10d”,打表输出。

AC代码

#include<stdio.h>
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");
    return 0;
}

你可能感兴趣的:(uva,138)