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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值