大数加法(使用结构体)

各位脱发友们:
在这里发表一个令我这个新手抓发的题目,虽然解出来但没有成就感的题目。
大数是算法语言中数据类型无法表示的数,所以处理大数问题时首先要考虑怎样存储大数。
一般情况下大数是采用数组来存储。例如:

     下标0位置存储大数的低位,还需要一个整数记录大数有多少位,即length。可以考虑这样的结构(顺序表):

#define Maxsize 100
typedef struct list {
int data[Maxsize];
int length;
} SeqList;

A+B
有一个非常简单的问题给你,给你两个整数A和B,你的任务是计算A+B。
输入:输入的第一行包含一个整数T(T<=20)表示测试实例的个数,然后2*T行,分别表示A和B两个正整数。注意整数非常大,那意味着你不能用32位整数来处理。你可以确定的是整数的长度不超过1000。
输出:对于每一个样例,你应该输出两行,第一行是"Case #:",#表示第几个样例,第二行是一个等式"A+B=Sum",Sum表示A+B的结果。注意等式中有空格。

输入样例:
2
1
2
112233445566778899
998877665544332211
输出样例:
Case 1:
1 + 2 = 3
Case 2:
112233445566778899 + 998877665544332211 = 1111111111111111110

#include<stdio.h>
#include<string.h>
#define Z 200
typedef struct List
{
	int data[Z];
	int length;
}Number;
Number Search(char c[],Number num);
int main()
{
	int T;
	Number num1,num2;
	char m[Z],n[Z];
	int a[Z],b[Z][Z];
	int len1,len2,l[Z];
	int i,j,k,d;
	
	scanf("%d",&T);
	for(i=0;i<T;i++)
	{
		d=0;
	    scanf("%s",m);            //以字符型输入大数 
		scanf("%s",n);
		
		num1=Search(m,num1);       //判断大数位数以及倒叙转换数组 
		num2=Search(n,num2);
		
		len1=num1.length;
		len2=num2.length;

		if(len1>len2) k=len1;     // 找到计算的位数 
		else k=len2;
	    
		for(j=0;j<k;j++)
		
		 
	    for(j=0;j<k;j++)
	    {
		    a[j]=num1.data[j]+num2.data[j]+d;
	        d=a[j]/10;
	    	a[j]=a[j]%10;
		}
	
	
	    if(d!=0)                  //确定大数位数
		 {
		 	a[k]=d;
		 	l[i]=k+1;
			 }                      
	    else l[i]=k;
	    
	    for(j=0;j<l[i];j++)
	    b[i][j]=a[j];
	    
	    for(i=0;i<T;i++)
	{ 
	    for(j=l[i]-1;j>=0;j--)            //将大数以数组形式输出 
		printf("%d",b[i][j]);
			
		printf("\n");
	}
	    
	}

	return 0;
}

Number Search(char c[],Number num)
{
	int i=0,j=0;
    num.length=strlen(c);
    
    for(i=0,j=num.length-1;i<num.length,j>=0;i++,j--)      //倒叙存入数组 
    {
    	num.data[i]=c[j]-'0';
	}
    
    return num;
}

其实在这里我在将数字重新转换为字符上浪费了老鼻子力气,结果还是没成功,后来想了想,可以直接转换为数字数组输出,稍稍的妥协一下吧–__–!

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流云枫木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值