zoukankan      html  css  js  c++  java
  • 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]
    ", i, j);
    					break; // 退出内层循环
    				}
    				else if(sum > m) { // 大于的话直接退出内层循环
    					break;
    				}
    			}
    		}
    		printf("
    "); // 本组数据结束换行
    	}
    	return 0;
    }

    五、截图

    1192:运行截图

  • 相关阅读:
    如何防止多个人同时编辑文件
    通过Word实现表单套打
    偏前端
    偏前端
    偏前端
    偏前端 -webpack打包之(安装webpack)
    偏前端
    偏前端
    偏前端
    偏前端--之小白学习本地存储与cookie
  • 原文地址:https://www.cnblogs.com/wowpH/p/11060849.html
Copyright © 2011-2022 走看看