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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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加上好的设计”也能写出非常好的东西。

参考技术A

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

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

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

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

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

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

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

参考技术B

声明两个长度超过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;

运行样例如下:

参考技术C #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");
参考技术D #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;

高精度加法

【题目描述】
求两个不超过200位的非负整数的和。

【输入】
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。

【输出】
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

【输入样例】
22222222222222222222
33333333333333333333

【输出样例】
55555555555555555555
#include<iostream>  
#include<cstring>  
#include<string>  
using namespace std;  
char s1[210],s2[210];
int a[210],b[210],c[210];

int main()
{
    cin>>s1;
    cin>>s2;
    int i,j,lena,lenb,lenc,max,x;
    lena=strlen(s1);
    lenb=strlen(s2);

    
    for(i=0;i<=lena;i++)    //逆序存储于数组中
        a[lena-i]=s1[i]-0;
    for(i=0;i<=lenb;i++)
        b[lenb-i]=s2[i]-0;

    x=0;    //x用来进位
    lenc=1;
    while(  (lenc<=lena)  ||  (lenc<=lenb)  )
    {
        c[lenc]=a[lenc]+b[lenc]+x;
        x=c[lenc]/10;
        c[lenc]=c[lenc]%10;
        lenc++;
    }
    c[lenc]=x;  //最后这个位也要进,别忘了
    while(c[lenc]==0)   //删除前导零
        lenc--;  
  
    for(i=lenc;i>0;i--)  //逆序输出数组c
        cout<<c[i];  
    cout<<endl;  
  
    return 0;  
} 

注意题目条件!输入可能会有前导零!

以上是关于c语言编程 求两个超过200位的非负整数的和的主要内容,如果未能解决你的问题,请参考以下文章

2981 大整数加法

高精度加法

1-6-10:大整数加法

高精度模板

一本通1168 高精度加法

AC日记——大整数加法 openjudge 1.6 10