VIJOS-P1141

题目描述

输入一个自然数n(n< 1e1000),表示1到n共n个自然数排成一列,你要在每一个数前添上+或-,要使得添加符号后这个代数式的值最小且非负.

输入

一个数,n.

输出

一个数,即最小非负值。

样例输入

5

样例输出

1

题目分析:
输入数N用到高精度,固要用字符串或字符数组型
题目中用到的知识:
  

我们知道,连续的四个整数可以让其和为0。-n+(n+1)+(n+2)-(n+3)=0。所以我们把1到n个数从后往前分成n div 4份。若n为5则1(-2+3+4-5)=1

N=10则-1+2(-3+4+5-6)(-7+8+9-10)=1

当然n mod 4=0时和就为0。于是我们要计算出n mod 4的值,只要计算1..n mod 4的最小非负值(n mod 4+1…n这些数的和为0,不用管它们)。那么需要高精度除法吗?不!若n>=100,我们设n=100a+b|b<100,前面的100a mod 4必=0,不用考虑,于是要计算n mod 4,只要计算n的最后两位(就是b)mod 4就行了!最后在根据mod出来的余数进行特判:

N mod 4=0:ans=0

N mod 4=1:ans=1

N mod 4=2:ans=-1+2=1

N mod 4=3:ans=-1-2+3=0

在算法中,若输入N是一位数,则将字符串的最后一位进行强制类型转换;若字符串长度大于1,则将倒数第二位也进行强制类型转换并乘10加上后一位。


代码实现
 1 #include<iostream>
 2 #include<cstring>  
 3 
 4 using namespace std;
 5 int a,longth;
 6 string n;
 7 int main()
 8 {
 9     getline (cin,n);
10     longth=n.length();
11     a=(int(n[longth-1])-int('0'));
12     if (longth>1) {a=a+( int(n[longth-2])-int('0') )*10 ;}
13     if  ( ((a%4)==1)||((a%4)==2) ) cout<<'1'<<endl; else cout<<'0'<<endl;
14     return 0;
15 }
View Code
原文地址:https://www.cnblogs.com/ljxahjh100/p/5702639.html