A+B Problem II

在这里插入图片描述

# include<iostream>
# include<cstdio>
# include<cmath>
using namespace std;
# define ll long long
ll a,b,n,m;
int main()
{
    
    
	while(scanf("%d",&n) !=EOF){
    
    
		m=n;
		while(n--){
    
    
			if(n>0){
    
    
				cin>>a>>b;
				cout<<"Case "<<m-n<<':'<<endl;
				cout<<a<<" + "<<b<<" = "<<a+b<<endl;
				cout<<endl;
			}
			else{
    
    
				cin>>a>>b;
				cout<<"Case "<<m<<':'<<endl;
				cout<<a<<" + "<<b<<" = "<<a+b<<endl;
			}
		}
	}
	return 0;
}

正确理解 while(n–):当 n 减到负数时才结束!
本以为可以轻松通过了,没想到提交时超出了时间限制!查了查资料,发现并没有我想象得那样简单!数据过大,一般的数学加法运算程序吃不消了!要借助数组处理,看来今天下午有活干了。。。待我学学数组先。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
using namespace std;
void fan(char *a,int k)//将 k 位字符串数据倒置
{
    
    
    for(int i=0;i<k/2;i++)
        swap(a[i],a[k-1-i]);
}
int main()
{
    
    
    char a[1005],b[1005],c[1005],A[1005],B[1005];//字符串设定足够大的初始空间
    int k1,k2,k;
    int n;
    while(scanf("%d",&n) !=EOF){
    
    
        int q=n;
        while(n--){
    
    
            memset(c,'0',sizeof(c));//初始化结果数组
            cin>>A>>B;
            strcpy(a,A);//拷贝数组以进行操作而保留原整型字符串
            strcpy(b,B);
            k1=strlen(a);
            k2=strlen(b);
            fan(a,k1);
            fan(b,k2);
            if(k1>k2){
    
    
                k=k1;
                for(int i=k2;i<k;i++)
                    b[i]='0';//对齐补0
            }
            else{
    
    
                k=k2;
                for(int i=k1;i<k;i++)
                    a[i]='0';//对齐补0
            }
            for(int i=0;i<k;i++){
    
    
                c[i]=c[i]+(a[i]-'0')+(b[i]-'0');//这种格式可以让整形字符串进行数学运算
                if(c[i]>'9')
                {
    
    
                    c[i]-=10;//处理进位
                    c[i+1]+=1;
                }
            }
            cout<<"Case "<<q-n<<':'<<endl;
            cout<<A<<" + "<<B<<" = ";//还没完,不要换行
            if(c[k]>'0')//最高位的进位单独考虑
                cout<<c[k];//一开始倒置,所以倒置输出
            for(int i=k-1;i>=0;i--)
                cout<<c[i];//一开始倒置,所以倒置输出
            cout<<endl;
            if(n>0)
                cout<<endl;
        }
    }
    return 0;
}

参考代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
using namespace std;
void un(char *a,int k)   //取反
{
    
    
    for(int i=0;i<k/2;i++)
        swap(a[i],a[k-1-i]);
}
int main()
{
    
    
    char a[1005],b[1005],c[1005],A[1005],B[1005];
    int k1,k2,k;
    int o;
    while(~scanf(" %d",&o))
    {
    
    
        int t=0;
    	int q=o;
        while(o--)
        {
    
    
            memset(c,'0',sizeof(c));
            scanf(" %s %s",A,B);
            strcpy(a,A);
            strcpy(b,B);
            k1=strlen(a);
            k2=strlen(b);
            un(a,k1);
            un(b,k2);
            if(k1>k2)//补零以对齐;
            {
    
    
                k=k1;
                for(int i=k2;i<k;i++)
                    b[i]='0';
            }
            else
            {
    
    
                k=k2;
                for(int i=k1;i<k;i++)
                    a[i]='0';
 
            }
            for(int i=0;i<k;i++)//相加和进位
            {
    
    
                c[i]=c[i]+(a[i]-'0')+(b[i]-'0');
                if(c[i]>'9')
                {
    
            
                    c[i]-=10;
                    c[i+1]+=1;
                }
            }
            printf("Case %d:\n%s + %s = ",++t,A,B);
            if(c[k]>'0')   //最高位进位单独考虑
                printf("%c",c[k]);
            for(int i=k-1;i>=0;i--)
            {
    
    
                printf("%c",c[i]);
            }
            printf("\n");
            if(t!=q)
                printf("\n");
        }
 
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/interestingddd/article/details/113824184
今日推荐