博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

远大目标

题目描述

给你 O,求出满足 |A∣<O 且 A 为整数的 A 的个数。

数据范围

Subtask 1(30 分): 0≤∣O∣≤2^10-1;

Subtask 2(60 分):0 ≤ |O| ≤ 2^{31}-1;

Subtask 3(10 分):0 ≤ |O| ≤ 2^{63}-1.


首先看到题目,我们知道 0≤|A∣;有|A∣<O,所以说我们不难得到O必须大于0,这才能使我们这道题有解,所以我们首先特判一下O的取值范围,如果O≤0;那么我们就可以直接输出0,结束程序了。

当此题有解的时候,我们可以通过数据看出规律:

ab
2 3
1145141919810 2290283839619
12345 24689

我们不难发现b=a*2-1;


我们可以直接输出

#include<bits/stdc++.h>
using namespace std;
int main(){
	long long a;
	cin>>a;
	if(a<=0){
		cout<<"0";
		return 0;
	}
	long long b=2*a-1;
	cout<<b;
	return 0;
}

但是我们通过数据发现数据要卡long long;
所以我们可以想到字符串

#include<bits/stdc++.h>
using namespace std;
int main() {
	string a;
	cin>>a;
	if(a[0]=='0'){
		cout<<"0";
		return 0;
	}
	if(a[0]=='-'){
		cout<<"0";
		return 0;
	}
	long long b[a.size()+1];
	for(int i=0; i<a.size(); i++) {
		if(int(b[i])>=48&&int(b[i])<=57){
			b[i]=(a[i]-'0')*2;
		}
		else{
			cout<<"0";
			return 0;
		}
	}
	int vis=0;
	for(int i=a.size()-1; i>=0; i--) {
		if(vis==1) {
			b[i]=b[i]+1;
		}
		if(b[i]>=10) {
			b[i]=b[i]-10;
			vis=1;
		} else {
			vis=0;
		}
	}
	int tot=1;
	if(b[a.size()-1]!=0) {
		b[a.size()-1]=b[a.size()-1]-1;
	} else {
		while(b[a.size()-tot]==0) {
			b[a.size()-tot]=9;
			tot++;
		}
		b[a.size()-tot]=b[a.size()-tot]-1;
	}
	int nbnnb=0;
	for(int i=0; i<a.size(); i++) {
		if(nbnnb==1){
			cout<<b[i];
		}
		else{
			if(b[i]==0){
				continue;
			}
			else{
				nbnnb=1;
				cout<<b[i];
			}
		}
	}
	return 0;
}

但是字符串这个程序十分麻烦,我们就想到了unsigned long long,就这样我们就可以过了 这个字符串程序还有点问题


程序:

#include<bits/stdc++.h>
using namespace std;
int main(){
	long long a;
	cin>>a;
	if(a<=0){
		cout<<"0";
		return 0;
	}
	unsigned long long b=2*a-1;
	cout<<b;
	return 0;
}
posted @ 2020-06-17 11:29  5656566  阅读(200)  评论(0)    收藏  举报