我也要努力才行
程序代码:
/* 从循环到穷举 练习题:哪些连续的自然数的和为1000 */ /* 思考: 连续的自然数相加等于1000 : x + (x + 1) + (x + 2) + (x + 3) + (x + 4) + ... ... + (x + n) == 1000 假设5个数相加等于1000: 5 * x + 1 + 2 + 3 + 4 = 1000 推导出n个数相加等于1000: n * x + 1 + 2 + 3 + 4 + ... + (n - 1) = 1000 x = 1000 - ( 1 + 2 + 3 + ... + n-1) / n n = 1000 - ( 1 + 2 + 3 + ... + n -1) / x 假设题目的连续的自然数是指1个以上的数字,由于 500 + 501 > 1000 , 所以 x < 500 for(x = 0; x < 500; x++) for(n = 2; n <= 1000 - ( 1 + 2 + 3 + n - 1) / x; n++) if(n = 1000 - (1 + 2 + 3 +...+ n - 1) / x for(i = n; i >= 0; i--) printf x; x++; */ #include <stdio.h> #define YQ 1000 //一千 #define WB 500 //第一个数字的最大上限 #define WS 50 //连续自然数的个数上限 int main(void) { unsigned first, sum; //起始数字和数字个数 unsigned tmp; //临时记录 n 个连续自然数的和 short i; //循环变量 for (first = 1; first < WB; first++) //从 1 到 500 查找连续自然数的第一个数 { for (sum = 2; sum < WS; sum++) //从 2 个数开始查找共有几个连续数相加等于1000 { tmp = 0; //清除上一次循环(1 + 2 + 3 + ... + n-1) 的值 for(i = 0; i < sum; i++) //计算(1 + 2 + 3 + ... + n-1) tmp += i; if((YQ - tmp) / first == sum && (YQ - tmp) % first == 0) //判断(1000 - (1+2+3+4+...+n-1)/first)的值 { for(i = 1; i <= sum; i++) //打印符合条件的连续自然数 { printf("%u ", first); first++; } printf("\n"); } } } return 0; }