A+B花式解(持续更新)

HFC202325 2021-02-24 8:48:20 2021-02-24 8:49:58

A + B Problem,一个不足挂齿的题目。

但,你有想过它的更多解法吗?

花式解法 - A + B Problem

(注:本人是个菜鸡,请各位大佬不要喷我)

原题在此

01/正常的解法

#include<iostream>
using namespace std;
int main()
{
	int a,b;
	cin>>a>>b;
	a+=b;
	cout<<a;
}

02/数组解法

#include<iostream>
using namespace std;
int main()
{
	int a[3],n=0;
	for(int i=1;i<=2;i++)
		cin>>a[i];
	for(int i=1;i<=2;i++)
		n+=a[i];
	cout<<n;
}

03/字符串解法

#include<cstdio>
int main()
{
    char a[5];
    scanf("%[^\n]",a);
    printf("%d",a[0]+a[2]-96);	//ASCII码与数字相差96,故减96
}

04/函数解法

#include<iostream>
using namespace std; 
int add(int x,int y)
{ 
	return(x+y);
}
int main()
{
	int a,b,n;
	cin>>a>>b;
	n = add(a,b);
	cout<<n;
	return 0;
}

05/打表解法

/*第一个 输入数据:1,2              输出数据:3
  第二个 输入数据:233,555           输出数据:788
  第三个 输入数据:1000000,1000000   输出数据:2000000
*/
#include<iostream>
using namespace std;
int main()
{
	int a,b;
	cin>>a>>b;
	if(a==1000000&&b==1000000)
		cout<<"2000000";
	else if(a==1&&b==2)
		cout<<"3";
	else 
		cout<<"788";
	return 0;
}

06/结构体解法

#include<iostream>
using namespace std;
struct sss
{
    int a,b;
}s[1];
int main()
{
    cin>>s[0].a>>s[0].b;
    cout<<s[0].a+s[0].b;
}

07/位运算解法

#include<iostream>
using namespace std;
int main()
{
	int a,b;
	cin>>a>>b;
	cout<<((a|b)+(a&b)*3+(a^b))/2;
	return 0;
}

08/位运算解法

#include<iostream>
using namespace std;

int x,y,ans;

long long vac(int a, int b) { if((a&b) == 0) return a|b; return vac(a^b,(a&b)<<1); } int main() { cin >> x >> y; long long ans=vac(x,y); cout << ans; return 0; }

09/树状数组解法

#include<iostream>
#include<cstring>
using namespace std;
int lowbit(int a)
{
    return a&(-a);
}
int main()
{
    int n=2,m=1;
    int ans[m+1];
    int a[n+1],c[n+1],s[n+1];
    int o=0;
    memset(c,0,sizeof(c));
    s[0]=0;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        s[i]=s[i-1]+a[i];
        c[i]=s[i]-s[i-lowbit(i)];//树状数组创建前缀和优化
    }
    for(int i=1;i<=m;i++)
    {
        int q=2;
        //if(q==1)
        //{(没有更改操作)
        //    int x,y;
        //    cin>>x>>y;
        //    int j=x;
        //    while(j<=n)
        //    {
        //        c[j]+=y;
        //        j+=lowbit(j);
        //    }
        //}
        //else
        {
            int x=1,y=2;//求a[1]+a[2]的和
            int s1=0,s2=0,p=x-1;
            while(p>0)
            {
                s1+=c[p];
                p-=lowbit(p);//树状数组求和操作,用两个前缀和相减得到区间和
            }
            p=y;
            while(p>0)
            {
                s2+=c[p];
                p-=lowbit(p);
            }    
            o++;
            ans[o]=s2-s1;//存储答案
        }
    }
    for(int i=1;i<=o;i++)
        cout<<ans[i]<<endl;//输出
    return 0;
}

10/递归解法(显示有bug,努力修复中)

11/高精度解法

#include<bits/stdc++.h>
using namespace std;
char a1[1000],b1[1000];
int a[1000],b[1000],c[1000],la,lb,lc=1,i,x;
int main()
	{
	cin>>a1>>b1;
	la=strlen(a1);
	lb=strlen(b1);
	for(i=0;i<=la-1;i++)
		a[la-i]=a1[i]-'0';
	for(i=0;i<=lb-1;i++)
		b[lb-i]=b1[i]-'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];
	return 0;
}

12/超级暴力解法(随机数)

(成功率≈0)

#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
int main()
{
	srand((unsigned)time(NULL));
	int a=rand()%1000000;
	cout<<a;
}

13/线段树解法

#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<iostream>
using namespace std;
struct node{
    int val,l,r;
};
node t[5];
int a[5],f[5];
int n,m;
void init(){
    for(int i=1;i<=2;i++){
        scanf("%d",&a[i]);
    }
}
void build(int l,int r,int node){//这是棵树
    t[node].l=l;t[node].r=r;t[node].val=0;
    if(l==r){
        f[l]=node;
        t[node].val=a[l];
        return;
    }
    int mid=(l+r)>>1;
    build(l,mid,node*2);
    build(mid+1,r,node*2+1);
    t[node].val=t[node*2].val+t[node*2+1].val;
}
void update(int node){
    if(node==1)return;
    int fa=node>>1;
    t[fa].val=t[fa*2].val+t[fa*2+1].val;
    update(fa);
}
int find(int l,int r,int node){
    if(t[node].l==l&&t[node].r==r){
        return t[node].val;
    }
    int sum=0;
    int lc=node*2;int rc=lc+1;
    if(t[lc].r>=l){
        if(t[lc].r>=r){
            sum+=find(l,r,lc);
        }
        else{
            sum+=find(l,t[lc].r,lc);
        }
    }
    if(t[rc].l<=r){
        if(t[rc].l<=l){
            sum+=find(l,r,rc);
        }
        else{
            sum+=find(t[rc].l,r,rc);
        }
    }
    return sum;
}
int main(){
    init();
    build(1,2,1);
    printf("%d",find(1,2,1));
}

欢迎在评论区讨论

持续更新中...

发布规则

1、请把源码发在评论区;
2、请不要压行;
3、请注明解法类型;
4、请在程序的最顶端和最低端分别写一个“```”;
5、在这里我们仅讨论C++,其他语言请不要发;
6、否则我会删评论。

共 1 条回复

HFC202325

字符串+瞎搞背包dp

#include<bits/stdc++.h>
using namespace std;
string a;
bool flag;
struct blc{
	int w,c;
}blk[5];
int dp[20][40];
int main() {
	int m,n;
	getline(cin,a);
	m=a.length()-1;
	n=2;
	for(int i=0;i<a.length();i++) {
		if(a[i]>='0'&&a[i]<='9'&&flag==0) {
			blk[1].c*=10;
			blk[1].c+=a[i]-'0';
			blk[1].w++;
		}
		if(a[i]>='0'&&a[i]<='9'&&flag==1) {
			blk[2].c*=10;
			blk[2].c+=a[i]-'0';
			blk[2].w++;
		}
		else if((a[i]>='0'&&a[i]<='9')==0){
			flag=1;
		}
	}
	for(int i=1;i<=n;i++) {
		for(int j=m;j>=1;j--) {
			if(j>=blk[i].w)
				dp[i][j]=max(dp[i-1][j],dp[i-1][j-blk[i].w]+blk[i].c);
			else 
				dp[i][j]=dp[i-1][j];
		}
	}
	cout<<dp[n][m];
    return 0;
}