1001 A+B Format (20 分)

本文探讨了使用C++进行加法运算的不同方法,并详细解析了如何根据特定格式要求输出结果,包括处理负数、整数及千位分隔符的正确显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:

https://pintia.cn/problem-sets/994805342720868352/problems/994805528788582400

我的7分代码:

#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <cstdlib>
#include <cmath>
using namespace std;

const int maxn=10;
int res[maxn];

int main()
{
    string a,b;
    cin>>a>>b;
    int la=a.size(),lb=b.size();
    //a,b均为负数
    if(a[0]=='-'&&b[0]=='-'){
        string stra=a.substr(1,la-1);
        string strb=b.substr(1,lb-1);
        int a1=atoi(stra.c_str());
        int b1=atoi(strb.c_str());
        int sum=a1+b1,num=0;
        do{
            res[num++]=sum%10;
            sum/=10;
        }while(sum);
        reverse(res,res+num);
        printf("-");
        if(num<4){
            for(int i=0;i<num;i++){
                printf("%d",res[i]);
            }
        }
        else{
            int camma=num/3;//计算逗号个数
            if(num%3==0)
                camma=camma-1;
            for(int i=0;i<num%3;i++)
                printf("%d",res[i]);
            camma=camma-1;
            int m=num%3,p=m+3;

            while(camma>=0&&p<=num){
                printf(",");
                for(int i=m;i<p;i++){
                    printf("%d",res[i]);
                }

                camma-=1;
                m=p;
                p+=3;
            }
        }
    }
    else if((a[0]>='0'&&a[0]<='9')&&(b[0]>='0'&&b[0]<='9')){
        int a1=atoi(a.c_str());
        int b1=atoi(b.c_str());
        int sum=a1+b1,num=0;
        do{
            res[num++]=sum%10;
            sum/=10;
        }while(sum);
        reverse(res,res+num);
        if(num<4){
            for(int i=0;i<num;i++){
                printf("%d",res[i]);
            }
        }
        else{
            bool flag=false;
            int camma=num/3;//计算逗号个数
            if(num%3==0)
                camma=camma-1;
            for(int i=0;i<num%3;i++){//判断第一个小数点是否输出
                printf("%d",res[i]);
                flag=true;
            }
            if(flag)
                camma=camma-1;//小数点数目减1
            int m=num%3,p=m+3;

            while(camma>=0&&p<=num){
                if(flag){
                    printf(",");
                }
                for(int i=m;i<p;i++){
                    printf("%d",res[i]);
                }
                flag=true;
                camma-=1;
                m=p;
                p+=3;
            }
        }
    }
    else{
        bool flaga=true,flagb=true;//记录a,b是否为正
        string stra,strb;
        if(a[0]=='-'){
            stra=a.substr(1,la-1);
            flaga=false;
        }
        else
            stra=a.substr(0,la);
        if(b[0]=='-'){
            strb=b.substr(1,lb-1);
            flagb=false;
        }
        else
            strb=b.substr(0,lb);
        int a1=atoi(stra.c_str());
        int b1=atoi(strb.c_str());
        int sum,num=0;
        if(flaga&&!flagb)
            sum=a1-b1;
        else if(!flaga&&flagb)
            sum=b1-a1;
        printf("%d\n",sum);
        if(sum==0){
            printf("0");
        }
        else if(sum<0){
            printf("-");
            sum=abs(sum);
            printf("%d\n",sum);
            do{
                res[num++]=sum%10;
                sum/=10;
            }while(sum);
            reverse(res,res+num);
            printf("-");
            if(num<4){
                for(int i=0;i<num;i++){
                    printf("%d",res[i]);
                }
            }
            else{
                bool flag=false;
                int camma=num/3;//计算逗号个数
                if(num%3==0)
                    camma=camma-1;
                for(int i=0;i<num%3;i++){//判断第一个小数点是否输出
                    printf("%d",res[i]);
                    flag=true;
                }
                if(flag)
                    camma=camma-1;//小数点数目减1
                int m=num%3,p=m+3;

                while(camma>=0&&p<=num){
                    if(flag){
                        printf(",");
                    }
                    for(int i=m;i<p;i++){
                        printf("%d",res[i]);
                    }
                    flag=true;
                    camma-=1;
                    m=p;
                    p+=3;
                }
            }
        }
        else {//大于0
            do{
            res[num++]=sum%10;
            sum/=10;
            }while(sum);
            reverse(res,res+num);
            if(num<4){
                for(int i=0;i<num;i++){
                    printf("%d",res[i]);
                }
            }
            else{
                bool flag=false;
                int camma=num/3;//计算逗号个数
                if(num%3==0)
                    camma=camma-1;
                for(int i=0;i<num%3;i++){//判断第一个小数点是否输出
                    printf("%d",res[i]);
                    flag=true;
                }
                if(flag)
                    camma=camma-1;//小数点数目减1
                int m=num%3,p=m+3;

                while(camma>=0&&p<=num){
                    if(flag){
                        printf(",");
                    }
                    for(int i=m;i<p;i++){
                    printf("%d",res[i]);
                        }
                    flag=true;
                    camma-=1;
                    m=p;
                    p+=3;
                }
            }
        }
    }
    return 0;
}

分类讨论,模拟写的,不想看为什么不对了(写得太复杂),

一个老毛病:能用整形算的数,不用拿字符串再转换,来算。

19分代码(测试点4一直出错):

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <cmath>
using namespace std;

char res[10];
int main(){
    int a,b;
    scanf("%d%d",&a,&b);
    int c=a+b;
    if(c==0)
        printf("0");
    else if(c<0){
        printf("-");
        c=abs(c);
    }

    sprintf(res,"%d",c);
    int num=strlen(res);
    int m=0;
    if(num%3==1){
        printf("%c",res[0]);
        m=1;
    }
    else if(num%3==2){
        printf("%c%c",res[0],res[1]);
        m=2;
    }
    else if(num%3==0){
//写成else(num%3==0)....错误找了半天....
        printf("%c%c%c",res[0],res[1],res[2]);
        m=3;
    }
    for(int i=m;i<num;i+=3){
        printf(",%c%c%c",res[i],res[i+1],res[i+2]);
    }
    return 0;
}

20分代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>

 using namespace std;

int main()
{
    int a, b, sum, c;
    sum = 0;

    scanf("%d %d", &a,&b);
    sum = a + b;

    if(sum < 1000 && sum > -1000)
        printf("%d\n",sum);
    else if(sum < 1000000 && sum > -1000000)
        printf("%d,%03d\n", sum/1000, abs(sum % 1000));
    else {
        c = sum % 1000000;
        printf("%d,%03d,%03d\n", sum / 1000000, abs(c/1000), abs(c%1000));
    }

    return 0;
}

殊途同归:


#include<iostream>

#include<cstdio>

using namespace std;

int main(){

    int a,b;

    cin>>a>>b;

    int c=a+b;

    if(c<0){cout<<'-';c=-c;}

    if(c>=1000000){

        printf("%d,%03d,%03d",c/1000000,c%1000000/1000,c%1000);

    }else if(c>=1000){

        printf("%d,%03d",c/1000,c%1000);

    }else{

        printf("%d",c);

    }

    return 0;

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值