HNUST OJ 1945 个位求和【增强版】

2023-11-27 16:40
文章标签 求和 oj 增强版 hnust 1945

本文主要是介绍HNUST OJ 1945 个位求和【增强版】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题 L: 个位求和【增强版】
时间限制: 1 Sec  内存限制: 128 MB

题目描述
将一个整数区间内所有整数的个位相加并输出。

输入
输入2个int类型整数m和n(m<=n),m与n之间由空格隔开。

输出
将区间[m,n]内所有整数的个位相加并输出。 

样例输入
1 18

样例输出
81

提示
新年福利,温馨提示: 
1)如果用int类型数据,暴力方法只能过90%的数据。最终可能会显示”答案错误10%“或”时间超限10%“。在OI排名表中可以看出得9分。没有优化思路的,得9分后请立刻转做其它题。 
2)如果想过另外10%的数据,请优化方法,且注意如果变量或运算的数据超过int最大值(2147483647),请采用long long定义变量, 变量的scanf和printf 请使用%lld作为格式说明符。

 思路

1. 对于 a \leq b 我们有  Plus(a,b) 为 区间 [a,b] 内所有整数的个位和。

 Plus(a,b)=\left\{\begin{matrix} Plus(a,b) & 0 < a < b \\ Plus(-b,-a)) & a < b < 0 \\ Plus(0,-a) + Plus(0,b)) & a < 0 < b \end{matrix}\right.

2. 找规律 我们拿  a=3,b=\left\{\begin{matrix} 12 \\ 22 \\ 32 \end{matrix}\right.  为例

当 a=3,b=12 时 , 

Plus(a,b) = 3 + 4 + 5 + 6 + 7 + 8 + 9 + 0 + 1 + 2 = \sum_{i=0}^{9}i

当 a = 3 , b = 22 时 , 

Plus(a,b) = 3 + 4 + 5 + 6 + 7 + 8 + 9 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 0 + 1 + 2 = 2*\sum_{i=0}^{9}i

当 a = 3,b=32 时 ,

Plus(a,b) = 3 + 4 + 5 + 6 + 7 + 8 + 9 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 0 + 1 + 2 = 3*\sum_{i=0}^{9}i

所以规律①  Plus(a,b)=\frac{b-a+1}{10}*\sum_{i=0}^{9}i  当且仅当  (b - a + 1)%10 == 0

然后再以  a=3,b=\left\{\begin{matrix} 13 \\ 14 \\ 15 \end{matrix}\right.  为例

当 a = 3,b = 13 时 ,

Plus(a,b) = 1*\sum_{i=0}^{9} + 3

当 a = 3,b = 14 时 ,

Plus(a,b) = 1*\sum_{i=0}^{9} + 3 + 4

当 a = 3, b = 15 时 ,

Plus(a,b) = 1*\sum_{i=0}^{9} + 3 + 4 + 5

可知 要在规律①上加 (b - a + 1)%10 个数

这个数 从 a + \frac{b-a+1}{10}*10(向下取整,先除再乘,不可抵消)开始

所以答案就出来了。

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
ll Plus (int a , int b) {ll temp=0;ll t=b-a+1;ll n=t/10;ll k=(a+n*10)%10;for (int i = 0 ; i < (b-a+1)%10 ; i++) {if (k == 10) {k = 0 ;}temp += k;k++ ;}return 45*n + temp ;
}
int main(){int m,n;ll ans=0;cin >> m >> n ;if (n < 0) {ans = Plus(-n,-m) ;} else if (m < 0) {ans = Plus(0,-m) + Plus(0,n) ;} else {ans = Plus(m,n) ;}cout << ans ;return 0;
}
/**************************************************************Problem: 1945User: 21XXXXXXXXLanguage: C++Result: 正确Time:0 msMemory:2024 kb
****************************************************************/
// 这里提供一个更容易的方法,建议学习这个#include <bits/stdc++.h>
using namespace std;// 2023 OneWanlong long get(int n) { // 此函数求 0 到 n 的个位和if (n < 0) return 0LL;return 45LL * (n / 10) + (n % 10) * (n % 10 + 1) / 2;
}int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int m, n;cin >> m >> n;if (m > 0) cout << get(n) - get(m - 1);else if (n < 0) cout << get(-m) - get(-n - 1);else cout << get(n) + get(-m);return 0;
}
/**************************************************************Problem: 1945User: 21XXXXXXXXLanguage: C++Result: 正确Time:0 msMemory:2180 kb
****************************************************************/

这篇关于HNUST OJ 1945 个位求和【增强版】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/428049

相关文章

1 模拟——67. 二进制求和

1 模拟 67. 二进制求和 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 示例 1:输入:a = "11", b = "1"输出:"100"示例 2:输入:a = "1010", b = "1011"输出:"10101" 算法设计 可以从低位到高位(从后向前)计算,用一个变量carry记录进位,如果有字符没处理完或者有进位,则循环处理。两个字符串对

Leetcode67---二进制求和

https://leetcode.cn/problems/add-binary/description/ 给出的两个二进制,我们可以从最后开始往前运算。 给当前短的一位前面补充0即可。 class Solution {public String addBinary(String a, String b) {//给的就是二进制字符串 最后一位开始遍历 如果没有就补充0?StringBuil

UVa 10820 Send a Table (Farey数列欧拉函数求和)

这里先说一下欧拉函数的求法 先说一下筛选素数的方法 void Get_Prime(){ /*筛选素数法*/for(int i = 0; i < N; i++) vis[i] = 1;vis[0] = vis[1] = 0;for(int i = 2; i * i < N; i++)if(vis[i]){for(int j = i * i; j < N; j += i)vis[j] =

【hdu】敌兵布阵(线段树,更加结点,区间求和)

最近开始刷线段树,主要围绕notonlysuccess的线段树总结刷。 结点修改还是比较简单的,不需要什么懒惰标记,直接二分递归就可以了。 #include <iostream>#include <cstdlib>#include <cstdio>#include <string>#include <cstring>#include <cmath>#include <vecto

上海市计算机学会竞赛平台2024年7月月赛丙组求和问题

题目描述 给定 nn 个整数 a1,a2,…,ana1​,a2​,…,an​,请问这个序列最长有多少长的前缀,满足元素的和大于或等于 00?如果任何长度大于 00 的前缀之和都为负数,则输出 00 输入格式 第一行:单个整数表示 nn第二行:nn 个整数表示 a1,a2,…,ana1​,a2​,…,an​ 输出格式 单个整数:表示最长的前缀长度,使得前缀的和大于等于 00 数据范围

哈理工OJ 2179(深搜)

组合 Time Limit: 1000 MSMemory Limit: 32768 K Total Submit: 7(5 users)Total Accepted: 6(5 users)Rating: Special Judge: No Description 给出一个正整数N,从集合{1,2,3..N} 中找出所有大小为k的子集, 并按照字典序从小到大输出。 Input 第一行是一个整

每日OJ_牛客_求和(递归深搜)

目录 牛客_求和(递归深搜) 解析代码 牛客_求和(递归深搜) 求和_好未来笔试题_牛客网 解析代码         递归中每次累加一个新的数,如果累加和大于等于目标,结束递归。此时如果累加和正好等于目标,则打印组合。向上回退搜索其它组合。此题本身就是一个搜索的过程,找到所有的组合。 #include <iostream>#include <cmath>#in

C/C++的阶乘求和以及变量存储数据大小

目录 1. 前言 2. 正文 2.1 问题 2.2 解决办法 2.2.1 思路 2.2.2 代码实现 2.2.3 测试结果 3. 备注 1. 前言 其实刚学C语言的时候,打击都会先认识,类型,像int,double之类的存储类型。在这篇文章中,就需要大家对这个大小有了解。 2. 正文 2.1 问题 题目描述: 一个正整数如果等于组成它的各位数字的阶乘之和,该整数

OJ-0905

题目 示例1: 输入:10 10 56 34 99 1 87 8 99 3 255 6 99 5 255 4 99 7 255 2 99 9 255 213 4输出:99 示例2: 输入:10 10 255 34 0 1 255 8 0 3 255 6 0 5 255 4 0 7 255 2 0 9 255 213 5输出:255 import java.util.

每日OJ_牛客_Emacs计算器(逆波兰表达式)

目录 牛客_Emacs计算器(逆波兰表达式) 解析代码 牛客_Emacs计算器(逆波兰表达式) Emacs计算器__牛客网 解析代码 逆波兰表达式(后缀表达式)求值,需要借助栈,思路: 循环输入,获取逆波兰表达式,然后进行以下补助,直到测试完所有的测试用例: 遇到数字字符串,将该数字字符串转化为数字然后入栈。遇到操作符时,从栈顶取两个数字,然后进行该运算符所对应运算