题目描述
给你 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,结束程序了。
当此题有解的时候,我们可以通过数据看出规律:
a | b |
---|---|
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;
}
原文链接: https://www.cnblogs.com/wozuishuaiwozuiniu6/p/13151476.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;
也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/356362
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!