14 条题解

  • 3
    @ 2025-5-3 19:55:03

    这里采用多种方法求解。

    方法一:读入·运算·输出

    #include <bits/stdc++.h>
    using namespace std;
    int a,b;
    int main(){
        cin>>a>>b;
        cout<<a+b;
        return 0;
    }
    

    方法二:“数手指”方法

    #include <bits/stdc++.h>
    using namespace std;
    int a,b,ans=0;
    int main() {
    	cin>>a>>b;
    	for (int i=1;i<=a;i++)
    		ans++;
    	for(int i= 1;i<=b;i++)
    		ans++;
    	cout<<ans;
    	return 0;
    }
    

    方法三:从算法数据结构的角度思考 设计一个算法:先将a和b插入到一个数据结构(栈、队列或堆)中,非空时,将头上的元素取出,如果大于1则拆成它减1和1(根据自己的喜好)再插入,否则统计答案。

    栈写法

    #include <bits/stdc++.h>
    using namespace std;
    int a,b,ans=0;
    stack<int> s;
    int main(){
    	cin>>a>>b;
    	s.push(a);
    	s.push(b);
    	while(!s.empty()){
    		int x=s.top();
    		s.pop();
    		if(x>1){
    			s.push(x-1);
    			s.push(1);
    		}
    		else
    			ans+=x; 
    	}
    	cout<<ans;
    	return 0;
    }
    

    队列写法

    #include <bits/stdc++.h>
    using namespace std;
    int a,b,ans=0;
    queue<int> q;
    int main(){
    	cin>>a>>b;
    	q.push(a);
    	q.push(b);
    	while(!q.empty()){
    		int x=q.front();
    		q.pop();
    		if(x>1){
    			q.push(x-1);
    			q.push(1);
    		}
    		else
    			ans+=x; 
    	}
    	cout<<ans;
    	return 0;
    }
    

    堆写法

    #include <bits/stdc++.h>
    using namespace std;
    int a,b,ans=0;
    priority_queue<int> h;
    int main(){
    	cin>>a>>b;
    	h.push(a);
    	h.push(b);
    	while(!h.empty()){
    		int x=h.top();
    		h.pop();
    		if (x>1) {
    			h.push(x-1);
    			h.push(1);
    		}
    		else
    			ans+=x; 
    	}
    	cout<<ans;
    	return 0;
    }
    

    方法四:使用高精度加法

    #include <bits/stdc++.h>
    using namespace std; 
    char s1[100], s2[100];
    int a[100], b[100], c[100];
    int main() {
        scanf("%s%s",s1+1,s2+1);
        int la=strlen(s1+1),lb = strlen(s2+ 1),lc;
        lc=max(la,lb);
    	for (int i = 1; i <= la; i++)
    		a[i] = s1[la - i + 1] - '0';
    	for (int i = 1; i <= lb; i++)
    		b[i] = s2[lb - i + 1] - '0';
    	memset(c, 0, sizeof(c));
    	for (int i = 1; i <= lc; i++) {
    		c[i] += a[i] + b[i];
    		c[i + 1] = c[i] / 10;
    		c[i] %= 10;
    	}
    	if (c[lc + 1] > 0)
    		lc++;
    	for (int i = lc; i >= 1; i--)
    		printf("%d", c[i]);
    	printf("\n");
    	return 0;
    }
    

    方法五:将方法三和方法四结合

    #include <bits/stdc++.h>
    using namespace std;
    int a,b,c[100],lc=1;
    priority_queue<int> h;
    int main() {
    	scanf("%d%d", &a, &b);
    	h.push(a);
    	h.push(b);
    	memset(c,0,sizeof(c));
    	while (!h.empty()) {
    		int x=h.top();
    		h.pop();
    		if (x>1){
    			h.push(x-1);
    			h.push(1);
    		}
    		else {
    			c[1]+=x;
    			for (int i=1;i<=lc;i++){
    				c[i+1]+=c[i]/10;
    				c[i]%=10;
    			}
    			if(c[lc+1]>0)
    				lc++;
    	}
    	for(int i=lc;i>=1;i--)
    		cout<<c[i];
    	cout<<endl;
    	return 0;
    }
    

    你竟然认真的看完了!!! 恭喜你,把简单 的问题复杂 化了!要是你真的看懂了,就说明你太没事闲的了

    • @ 2025-10-25 19:57:31

      恭喜你,方法四和我在洛谷错的一样

      高精度没考虑负数,于是乎我不得不添加高精度减法

信息

ID
5059
时间
1000ms
内存
512MiB
难度
1
标签
递交数
2222
已通过
1478
上传者