UDP广播协议叫吃饭


私信TA

用户名:Mustenaka

访问量:84171

签 名:

个人博客www.mustenaka.cn

等  级
排  名 12
经  验 16782
参赛次数 8
文章发表 194
年  龄 3
在职情况 学生
学  校 Sky_box
专  业 NE

  自我简介:

欢迎光临我的博客www.mustenaka.cn,Python,C#,U3D,C/C++开发合作可以找我

/*别看C/C++我们用的那么多,实际上有很多功能都是需要我们自己写的,比如说这个大数加法,如果你是如PY桶用户,JAVA用户之类的,用已有的封装类就可以轻易达到这个功能*/


解题思路:
基本思路均为使用一个数组将所需要求得大数字存起来,然后进行倒叙相加,发现超过十之后取模进位,再倒叙输出去多余的0即可。

按从低位到高位的顺序两个数字的每一位对应相加,并加上低一位的进位(如果有进位的话),如果某一位对应的数字加起来大于10,就对10取模得到当前位上的数字,再向高位进1,然后再考虑更高一位数字的相加,依次类推,如果位数较长的那个数字的最高位还有进位,别忘记了位数还要增加1。

这里附一个图(当然我不是图的作者,我只是引用):

大数字计算方法.png



此外,由于C++的特性,string变量的存在,可以利用string的特性达成一些比较麻烦的char[]方法,这里提供两种代码来分别表示char[]和string的运算方法(内容大同小异)

参考代码:

char[]法:

#include<bits/stdc++.h>
#define MAX 1005
using namespace std;
int *my_plus(char arry1[],int len1,char arry2[],int len2) {
	int a[MAX]= {0},b[MAX]= {0}; //这里一定要全部赋值为0,以免出现问题,可以用函数memset(a,0,sizeof(a))代替
	for(int i=strlen(arry1)-1,j=0; i>=0; i--) {
		a[j++]=arry1[i]-'0';
	}
	for(int i=strlen(arry2)-1,j=0; i>=0; i--) {
		b[j++]=arry2[i]-'0';
	}
	for(int i=0; i<MAX; i++) {
		a[i]+=b[i];
		if(a[i]>=10) {
			a[i+1]+=a[i]/10;
			a[i]%=10;
		}
	}
	for(int i=MAX-1; i>=0; i--) {
		if(a[i]==0) {
			continue;
		} else {
			for(; i>=0; i--)
				cout<<a[i];
			break;
		}
	}
	cout<<endl;
	return 0;
}
int main() {
	char arry1[MAX],arry2[MAX];
	cin>>arry1;
	cin>>arry2;
	int len1=strlen(arry1),len2=strlen(arry2);
	if(len1<len2) {
		char temp[MAX];
		strcpy(temp,arry1);
		strcpy(arry1,arry2);
		strcpy(arry2,temp);
	}
	my_plus(arry1,len1,arry2,len2);
	return 0;
}

这里说一下,数组需要提前赋值为{0},否则的话在输出的时候容易出现一大串乱七八糟的数字,如果不手动赋值为{0}的话,可以使用memset初始化函数用法(如:数组a)memset(a,0,sizeof(a));用于将数组内容清空为0。

理论上字符数组也可以用这个来清空,但是由于我们实际运算都是在操作整形数组,所以这个不请客也可以了。

string的方法(定义一个变量存储临时的位相加)

#include<iostream>
#include<string>
using namespace std;
string person_plus(string a,int lena,string b,int lenb){
	int flag=0,aa,bb,sum;
	while(lena>0) {
		aa=a[lena-1]-'0';
		if(lenb>0)
			bb=b[lenb-1]-'0';
		else
			bb=0;
		sum=aa+bb+flag;
		if(sum>=10) {
			a[lena-1]='0'+sum%10;
			flag=1;
		} else {
			a[lena-1]='0'+sum;
			flag=0;
		}
		lena--;
		lenb--;
	}
	if(flag==1)
		a="1"+a;
	return a;
}


int main() {
	string a,b;
	cin>>a;
	cin>>b;
	if(a.size()<b.size()) {
		string temp=a;
		a=b;
		b=temp;
	}
	cout<<person_plus(a,a.length(),b,b.length())<<endl;
	return 0;
}

两个代码都可以通过系统。


这里大家可以看得出一件事情,利用string可以更方便把数据传递给主函数,主函数只需要进行调用,而使用char[]虽说不是不能传递,但是相比string而言传递更加麻烦,麻烦则不方便主函数进行调用,可以见的,string在输出的时候直接cout即可,而char[]还要配合循环使用。



PS一下这个题解的前面几个发表者都是我学长!

这题也是他们教的。

 

0.0分

3 人评分

  评论区

先不说代码,光是那幅图,我就明白了
2021-08-17 16:09:13 | |
  • «
  • 1
  • »