1192: 零起点学算法99——The sum problem(C)

一、题目

http://acm.wust.edu.cn/problem.php?id=1192&soj=0

二、分析

  1. 要求从序列1,2,3,,,N,中截取一部分使他们的和为M
  2. 输入多组数据
  3. 输入0 0结束
  4. 每组数据结束有一个空行

三、思路

  1. 定义i,j,且1<=i<=j<=N,计算从i至j的数据的和sum,sum=(i+j)*(j-i+1)/2,sum与M比较,若相等则输出i,j。当输入100000 100000时,运行的时间较长(我没提交不知道有没有超时)。
  2. 改进一下,1<=i<=j<=min(N,M),与方法1比较,增加了取较小数,因为当i或j大于M时,显然sum是大于M的,所以取小,运行时间略微缩短,取决于N和M之间的差距。
  3. 再次改进,当i和j满足时,j继续自增时,sum肯定大于M,直接退出内层循环,同理当sum大于M时,也直接退出内层循环。

四、代码

#include<stdio.h>
int main() {
	int n, m, i, j, sum;
	while (scanf("%d%d", &n, &m) && n != 0 && m != 0) {
		n = n > m ? m : n; // 取n和m中较小的数赋值给n
		for (i = 1; i <= n; i++) { // 从1到n
			for (j = i; j <= n; j++) { // 从i到n
				sum = (i + j)*(j - i + 1) / 2; // 计算i,i+1,……,j-1,j的和
				if (sum == m) {
					printf("[%d,%d]\n", i, j);
					break; // 退出内层循环
				}
				else if(sum > m) { // 大于的话直接退出内层循环
					break;
				}
			}
		}
		printf("\n"); // 本组数据结束换行
	}
	return 0;
}

五、截图

1192:运行截图

猜你喜欢

转载自blog.csdn.net/pfdvnah/article/details/86769470