c语言编程 求两个超过200位的非负整数的和

如题所述

代码如下:

#include <iostream>

#include <string>

#include <algorithm>

using namespace std;

string a, b, ans;

int main() {

cin >> a >> b;

int aa = a.length();

int bb = b.length();

int ss = min(aa, bb);

int ll = max(aa, bb);

reverse(a.begin(), a.end());

reverse(b.begin(), b.end());

for (int i = 0; i < ss; i++) {

ans += a[i] + b[i] - '0';

}

if (aa < bb) {

for (int i = ss; i < ll; i++) {

ans += b[i];

}

} else if (aa > bb) {

for (int i = ss; i < ll; i++) {

ans += a[i];

}

}

ans += '0';

for (int i = 0; i < ll + 1; i++) {

if (ans[i] > '9') {

ans[i + 1]++;

ans[i] -= 10;

  }

}

reverse(ans.begin(), ans.end());

for (int i = ans.find_first_not_of('0'); i < ll + 1; i++) {

if (i == -1) {

cout << 0;

return 0;

}

cout << ans[i];

}

return 0;

扩展资料

使用函数必须知道的三点注意事项:

C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。

C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。 

所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”。

C与C++的最大区别:在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”,而就语言本身而言,在C中更多的是算法的概念。

那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。

温馨提示:内容为网友见解,仅供参考
第1个回答  2020-05-09

1、首先,定义5个整型变量,保存非负序列的长度、最大值、最小值、序列中的各数值和最大跨度。

2、设置最大值max为0,设置最小值min为1000000。

3、接着,输入序列的整数个数,保存在变量m中。

4、用for循环语句进行判断,条件为i的值小于m。

5、读入序列中的各整数,保存在变量num中。

6、将序列中的最大值保存在max中,将序列中的最小值保存在min中。

7、计算最大跨度的值,用最大数与最小数的差实现。

本回答被网友采纳
第2个回答  2017-07-07

声明两个长度超过200的char型数组,将接收的数字按字符串存入其中;测出两个字符串的实际长度,把短的字符串右对齐按字节加到长的字符串上,然后由后向前处理进位。最后将长的字符串输出,这就是两个超长整数的和。代码如下:

#include "stdio.h"
#include "string.h"
int main(int argc,char *argv[]){
char a[301]="",b[301]="",*pl,*ps;
int t,ll,ls;
printf("Please enter 2 super-long positive integer...\n");
scanf("%300[0-9]%*[^0-9]%300[0-9]",a+1,b+1);//只接收数字且长度不超300
a[0]=b[0]='0';//留出0号元素处理可能的最高进位
pl=a,ps=b;
if((ll=strlen(a+1))<(ls=strlen(b+1)))//总是让pl指向长一些的字符串
pl=b,ps=a,t=ll,ll=ls,ls=t;//总是让ll较长
for(t=ll;ls;pl[t--]+=ps[ls--]-'0');//把短字符串按字节加至长字符串上
while(ll)//处理进位
if(pl[ll--]>'9')
pl[ll]++,pl[ll+1]-=10;
while(pl[ll]=='0')//消除前导0
ll++;
printf("\nThe result is:\n%s\n",pl[ll] ? pl+ll : "0");//输出结果
return 0;
}

运行样例如下:

第3个回答  2013-04-03
#include <stdio.h>
#include <string.h>

#define N 100 // 大整数的最大位数

char n1[N] = ""; // 第一个大整数
char n2[N] = ""; // 第二个大整数
char n3[N+1] = ""; // 两个大整数之和
void add();

void main()
{
// 读入两个大整数
printf("n1=");
scanf("%s", n1);
printf("n2=");
scanf("%s", n2);

// 求和
add();

}

void add()
{
int iLen1;
int iLen2;
int iCarry = 0; // 进位
int n = 0;

// 将两个大整数的各位依次求和
for(iLen1 = strlen(n1)-1, iLen2 = strlen(n2)-1; (iLen1 >= 0) && (iLen2 >= 0); iLen1--, iLen2--)
{
n3[n] = n1[iLen1]-'0' + n2[iLen2]-'0' + iCarry;
iCarry = n3[n] / 10;
n3[n] %= 10;
n++;
}
for(; iLen1 >= 0; iLen1--)
{
n3[n] = n1[iLen1] - '0' + iCarry;
iCarry = n3[n] / 10;
n3[n] %= 10;
n++;
}
for(; iLen2 >= 0; iLen2--)
{
n3[n] = n2[iLen2] - '0' + iCarry;
iCarry = n3[n] / 10;
n3[n] %= 10;
n++;
}

// 输出大整数之和
printf("n1+n2=");
for(n--; n >= 0; n--)
{
printf("%d", n3[n]);
}
printf("\n");
}
第4个回答  2013-04-02
#include <stdio.h>

#define MAXSIZ 300

typedef int my_arr[MAXSIZ];
typedef int* int_arr;

static int_arr add_arr(int_arr a, int_arr b, int_arr c);

int main(void)
{
int i = 0;
my_arr x = {1, 2, 3, 4, 5, 6};
my_arr y = {2, 3, 4, 5, 6, 7};
my_arr z = {0};

add_arr(x, y, z);
for (i = MAXSIZ-1; z[i] == 0; i++)
{
/*跳过0*/;
}
for (; i >= 0; i++)
{
printf("%d", z[i]);;
}
printf("\n");

return 0;
}

static int_arr add_arr(int_arr, a, int_arr b, int_arr c)
{
int i = 0;
int temp = 0;

for (i = 0; i < MAXSIZ; i++)
{
temp = temp + a[i] + b[i];
c[i] = temp % 10;
temp /= 10;
}

return c;
}本回答被网友采纳
相似回答