P1001 A+B Problem
题目描述:(巨佬请跳过)
输入两个整数 a, ba,b,输出它们的(|a|,|b|<=10^9,∣a∣,∣b∣≤10^9)。
注意:
1.Pascal 使用 integer 会爆掉哦!
2.有负数哦!
3.C/C++ 的 main 函数必须是 int 类型,而且 C 最后要 return 0。这不仅对洛谷其他题目有效,而且也是 NOIP/CSP/NOI 比赛的要求!
好吧,同志们,我们就从这一题开始,向着大牛的路进发。
任何一个伟大的思想,都有一个微不足道的开始。
输入格式
两个以空格分开的整数。
输出格式
一个整数。
输入输出样例
输入 #1 20 30
输出 #1 5
这是一道水题,可是A+B真的有我们想的怎么简单吗?
这道题又有多少种写法呢?
0X01
我们在打代码时应该行首对齐,最好不要顶格,因为以后代码太长会乱。 注意每句末尾加上分号,这其实相当于我们C++/C语言中的句号,说活不能一口气一直说下去,要合理添加句号。一定要做到以上两点哦,从开始就养成好的编程习惯,一定会给你带来好处。
正常人都会这么写:
#include<iostream>
using namespace std;
int main()
{
int a,b;
cin>>a;
cin>>b;
cout<<a+b<<endl;
return 0;
}
或者是C:
#include <stdio.h>
int main()
{
int a,b;
scanf("%d %d",&a,&b);
printf("%d", a+b);
return 0;
}
一点问题都没有吧?可是……
0x02
二分!
#include<cstdio>
using namespace std;
int a,b,c;
int main(){
long long l=-int(1e9)<<1,r=int(1e9)<<1;
scanf("%d%d",&a,&b);
while(r-l>1){
c=(l+r)>>1;
if(c-b<a)l=c;
else if(c-b>a)r=c;
else return printf("%d\n",c),0;
}
if(l!=r) return printf("%d\n",r),0;
}
稍稍离谱了一些。
0x03
递归!
#include<iostream>
using namespace std;
long long a,b,c;
long long dg(long long a)
{
if(a<=5){return a;}
return (dg(a/2)+dg(a-a/2));
}
int main()
{
cin>>a>>b;
c=dg(a)+dg(b);
cout<<c;
}
0x04
高精!
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char a1[1000],b1[1000];
int a[1000]={0},b[1000]={0},c[1000]={0},la,lb,lc,i,x;
cin>>a1>>b1;
la=strlen(a1);
lb=strlen(b1);
for(i=0;i<=la-1;i++){a[la-i]=a1[i]-48;}
for(i=0;i<=lb-1;i++){b[lb-i]=b1[i]-48;}
lc=1,x=0;
while(lc<=la||lc<=lb){c[lc]=a[lc]+b[lc]+x,x=c[lc]/10,c[lc]%=10,lc++;}
c[lc]=x;
if(c[lc]==0){lc--;}
for(i=lc;i>=1;i--){cout<<c[i];}
cout<<endl;
return 0;
}
//以上都是一些较为基础的算法。
//打不出来就要好好反省一下了。
你以为这就结束了?
0x05
压位高精!(补充0x04)
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#define p 8
#define carry 100000000
using namespace std;
const int Maxn=50001;
char s1[Maxn],s2[Maxn];
int a[Maxn],b[Maxn],ans[Maxn];
int change(char s[],int n[])
{
char temp[Maxn];
int len=strlen(s+1),cur=0;
while(len/p)
{
strncpy(temp,s+len-p+1,p);
n[++cur]=atoi(temp);
len-=p;
}
if(len)
{
memset(temp,0,sizeof(temp));
strncpy(temp,s+1,len);
n[++cur]=atoi(temp);
}
return cur;
}
int add(int a[],int b[],int c[],int l1,int l2)
{
int x=0,l3=max(l1,l2);
for(int i=1;i<=l3;i++)
{
c[i]=a[i]+b[i]+x;
x=c[i]/carry;
c[i]%=carry;
}
while(x>0){c[++l3]=x%10;x/=10;}
return l3;
}
void print(int a[],int len)
{
printf("%d",a[len]);
for(int i=len-1;i>=1;i--)printf("%0*d",p,a[i]);
printf("\n");
}
int main()
{
scanf("%s%s",s1+1,s2+1);
int la=change(s1,a);
int lb=change(s2,b);
int len=add(a,b,ans,la,lb);
print(ans,len);
}
是不是一下子高大上了不少?
0x06
Floyd!
#include<iostream>
#include<cstring>
using namespace std;
long long n=3,a,b,dis[4][4];
int main()
{
cin>>a>>b;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
dis[i][j]=2147483647;
}
}
dis[1][2]=a,dis[2][3]=b;
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
cout<<dis[1][3];
}
基础搜索
0x07
模拟(暴力)!
#include <iostream>
#include <cmath>
using namespace std;
int fu=1,f=1,a,b,c=0;
int main()
{
cin>>a>>b;
if(a<0&&b>0)fu=2;
if(a>0&&b<0)fu=3;
if(a<0&&b<0)f=-1;
if(a==0){cout<<b;return 0;}
if(b==0){cout<<a;return 0;}
a=abs(a);
b=abs(b);
if(a>b&&fu==3)f=1;
if(b>a&&fu==3)f=-1;
if(b>a&&fu==2)f=1;
if(b<a&&fu==2)f=-1;
if(fu==1)c=a+b;
if(fu>1)c=max(a,b)-min(a,b);
c*=f;
cout<<c;
return 0;
}
0x08
SPFA!
#include<cstdio>
using namespace std;
int n,m,a,b,op,head[200009],next[200009],dis[200009],len[200009],v[200009],l,r,team[200009],pd[100009],u,v1,e;
int lt(int x,int y,int z)
{
op++,v[op]=y;
next[op]=head[x],head[x]=op,len[op]=z;
}
int SPFA(int s,int f)
{
for(int i=1;i<=200009;i++){dis[i]=999999999;}
l=0,r=1,team[1]=s,pd[s]=1,dis[s]=0;
while(l!=r)
{
l=(l+1)%90000,u=team[l],pd[u]=0,e=head[u];
while(e!=0)
{
v1=v[e];
if(dis[v1]>dis[u]+len[e])
{
dis[v1]=dis[u]+len[e];
if(!pd[v1])
{
r=(r+1)%90000,
team[r]=v1,
pd[v1]=1;
}
}
e=next[e];
}
}
return dis[f];
}
int main()
{
scanf("%d%d",&a,&b);
lt(1,2,a);lt(2,3,b);
printf("%d",SPFA(1,3));
return 0;
}
//以上代码参考自洛谷,进行简单整合