首页 > 试题广场 >

高精度整数加法

[编程题]高精度整数加法
  • 热度指数:130102 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
输入两个用字符串 str 表示的整数,求它们所表示的数之和。

数据范围:

输入描述:

输入两个字符串。保证字符串只含有'0'~'9'字符



输出描述:

输出求和后的结果

示例1

输入

9876543210
1234567890

输出

11111111100
#include <stdio.h>
#include <string.h>

int main() {
    char input1[10024] = {0};
    char input2[10024] = {0};

    gets(input1);
    gets(input2);

    char temp1[10024] = {0};
    char temp2[10024] = {0};

    int len ;
    len = strlen(input1);
    int j ;
    j = 0;
    for (int i = len - 1; i >= 0; i--) {
        temp1[j++] = input1[i] - '0';
    }

    len = strlen(input2);
    j = 0;
    for (int i = len - 1; i >= 0; i--) {
        temp2[j++] = input2[i] - '0';
    }

    char output[10024] = {0};
    int flag = 0;

    for(int i=0;i<10024;i++){//0
        int sum = temp1[i] + temp2[i] + flag;//10,11,1
        output[i] = sum % 10;//0,1,1
        flag = sum / 10;//1,1,0
    }

    flag = 0;
    for(int i=1024-1;i>=0;i--){
        if(output[i]){
            flag = 1;
            printf("%d", output[i]);
        }else if (flag) {
            printf("%d", output[i]);
        }
    }
    /* all 0 */
    if(0 == flag){
        printf("0");
    }

    printf("\n");

    return 0;
}

发表于 2024-02-28 10:21:57 回复(0)
#include <stdio.h>
#include <string.h>

int main() {
    char str1[10001] = { '\0' };
    char str2[10001] = { '\0' };
    char ret[10002] = { '\0' };
    while (scanf("%s %s", str1, str2) != EOF) {
        int len1 = strlen(str1);
        int len2 = strlen(str2);
        int i = 0;
        int tmp = 0;
        int flag = 0;
        ret[0] = '0';
        ret[1] = '0';
        while (len1 && len2)
        {
            tmp = (ret[i] - '0') + (str1[len1 - 1] - '0') +  (str2[len2 - 1] - '0');
            if (tmp > 9)
            {
                flag = tmp / 10;
                tmp = tmp % 10;
            }
            else
            {
                flag = 0;
            }
            ret[i] =  tmp + '0';
            ret[i + 1] = flag + '0';
            ret[i + 2] = '0';
            i++;
            len1--;
            len2--;
        }
        if (len1==0)
        {
            while (len2)
            {
                tmp = (ret[i] - '0') + (str2[len2 - 1] - '0');
                if (tmp > 9)
                {
                    flag = tmp / 10;
                    tmp = tmp % 10;
                }
                else
                {
                    flag = 0;
                }
                ret[i] = tmp + '0';
                ret[i + 1] = flag + '0';
                i++;
                len2--;
            }
        }
        else {
            while (len1)
            {
                tmp = (str1[len1 - 1] - '0') + (ret[i] - '0');
                if (tmp > 9)
                {
                    flag = tmp / 10;
                    tmp = tmp % 10;
                }
                else
                {
                    flag = 0;
                }
                ret[i] =tmp + '0';
                ret[i + 1] = flag + '0';
                i++;
                len1--;
            }
        }
        if (ret[i] == '0')
        {
            i--;
        }
        while (i >= 0)
        {
            printf("%c", ret[i]);
            i--;
        }
    }
    return 0;
}
发表于 2023-10-18 13:54:17 回复(0)
#include <stdio.h>
#include <string.h>

int main() {
    char a[10001],b[10001],c[10001]={"\0"};
    scanf("%s",a);
    scanf("%s",b);
    int i=strlen(a)-1,j=strlen(b)-1,t,m;
    if(i>j) t=i;
    else t=j;
    m=t;
    while(a[i]&&b[j]){
        c[t--]=a[i--]+b[j--]-'0';
    }
    if(a[i]){
        while (a[i]) {
        c[t--]=a[i--];
        }
    }
    if(b[j]){
        while (b[j]) {
        c[t--]=b[j--];
        }
    }
    for(i=m ;i>0 ;i--){
        if(c[i]>'9') c[i-1]++,c[i]-=10;
    }
    if(c[0]>'9')  c[0]-=10,printf("1");
    for(i=0;i<=m;i++){
        printf("%c",c[i]);
    }
    return 0;
}
觉得不错的话就点个赞吧!

发表于 2023-05-04 15:43:28 回复(0)
#include <stdio.h>
#include <string.h>

typedef struct data{
    int value;  //本位计算结果
    int c;      //是否有进位
}Data;

Data add(int a, int b, int c){   //a,b是本位,c是来自低位的进位
    Data data = {0};
    int sum = 0;
    sum = a + b + c;
    if(sum > 9)
    {
        data.c = 1;
    }
    data.value = sum%10;
    return data;
}

void reverse(char *str){    //字符串翻转
    int len = strlen(str);
    for(int i=0; i<len/2; i++){
        char temp = str[i];
        str[i] = str[len-1-i];
        str[len-1-i] = temp;
    }
}

int max(int a,int b){
    return a>b? a:b;
}

int min(int a, int b){
    return a<b ? a:b;
}

int main() {
    char str1[10000] = {0};
    char str2[10000] = {0};
    char out[10001] = {0};
    int c[10001] = {0};

    scanf("%s", str1);
    scanf("%s", str2);
    reverse(str1);
    reverse(str2);
    
    int len1 = strlen(str1);
    int len2 = strlen(str2);

    int max_len = max(len1,len2);
    int min_len = min(len1,len2); 
    for(int i=0; i<min_len; i++)    //取长度小的部分进行计算
    {
        int num1 = str1[i] - '0';
        int num2 = str2[i] - '0';
        Data data = {0};
        if(i == 0)
            data = add(num1, num2, 0);  //初始状态进位为0
        else
            data = add(num1, num2, c[i-1]);

        c[i] = data.c;      //保存进位情况
        out[i] = '0' + data.value;
    }

    //剩下数字进行拼接,注意处理上面的最后一个进位
    char* last_str = NULL;
    if(len1 > len2) 
        last_str = str1;
    else
        last_str = str2;
    int out_len = min_len;        //记录输出数字长度
    if(min_len == max_len)
    {
        if(c[min_len-1])        //有进位
        {
            out_len++;
            out[min_len] = '1';
        }    
    }
    else 
    {
        for(int i=min_len; i<max_len; i++)
        {
            out_len++;
            if(c[i-1])        //有进位
            {
                if(last_str[i] == '9')
                {
                    out[i] = '0';
                    c[i] = 1;
                }
                else
                {
                    out[i] = last_str[i] + 1;
                }
            }
            else
            {
                out[i] = last_str[i];
            }
        }
    }

    for(int i=0; i<out_len; i++)
        printf("%c", out[out_len-i-1]);
    return 0;
}

发表于 2023-03-03 16:45:49 回复(0)

在本地IDE和在线调试都没问题,但是提交的话就会出现莫名奇妙的不通过,有没有大哥帮忙看看啊?

#include <stdio.h>
#include <string.h>

int main(void)
{
    char str1[10001] = {'\0'};
    char str2[10001] = {'\0'};
    char sum[10001] = {'\0'};
    int tmp = 0, cp = 0;

    fgets(str1, 10001, stdin);
    fgets(str2, 10001, stdin);

    int len1 = (int) strlen(str1) - 1;
    int len2 = (int) strlen(str2) - 1;

    int length = (len1 > len2) ? len1 : len2;

    char s1[length];
    char s2[length];
    memset(s1, '0', length * sizeof(int));
    memset(s2, '0', length * sizeof(int));

    for (int i = 0; i < len1; ++i)
    {
        s1[i] = str1[len1 - 1 - i];
    }
    for (int i = 0; i < len2; ++i)
    {
        s2[i] = str2[len2 - 1 - i];
    }

    for (int i = 0; i <= length; ++i)
    {
        tmp = 0;
        tmp = (s1[i] - '0') + (s2[i] - '0') + cp;
        if (tmp >= 10)
        {
            sum[i] = (char) (tmp - 10 + '0');
            cp = 1;
        } else
        {
            sum[i] = (char) (tmp + '0');
            cp = 0;
        }
    }
    int len3 = (int) strlen(sum);
    if (sum[len3 - 1] == '0')
    {
        sum[len3] = '\0';
        len3--;
    }

    char sumcp[len3 + 1];
    for (int i = 0; i < len3; ++i)
    {
        sumcp[i] = sum[len3 - 1 - i];
    }
    sumcp[len3] = '\0';
    printf("%s", sumcp);
    return 0;
}
发表于 2022-05-04 09:16:01 回复(0)
#include <stdio.h>
#include <string.h>
#define    N    10005
void reverse_order(char str[],int len)
{
    int left=0,right=len-1;
    char temp;
    while(left<right)
    {
        temp=str[left];
        str[left]=str[right];
        str[right]=temp;
        left++;right--;
    }
}
int main()
{
    char str1[N]={'\0'},str2[N]={'\0'};
    scanf("%s%s",str1,str2);
    int len1=strlen(str1);
    int len2=strlen(str2);
    int flag=0,i=0,sum;
    reverse_order(str1,len1);
    reverse_order(str2,len2);
    if(len1>=len2)
    {
        while(str1[i]!='\0')
        {
            if(str2[i]!='\0')
            {
                sum=str1[i]-'0'+str2[i]-'0'+flag;
                if(sum>9)
                {
                    flag=1;
                    str1[i]=sum-10+'0';
                }
                else
                {
                    flag=0;
                    str1[i]=sum+'0';
                }
            }
            else
            {
                sum=str1[i]-'0'+flag;
                if(sum>9)
                {
                    flag=1;
                    str1[i]=sum-10+'0';
                }
                else
                {
                    flag=0;
                    str1[i]=sum+'0';
                }                
            }
            i++;
        }
        if(flag)
        {
            str1[i]='1';
            len1++;
        }
        reverse_order(str1,len1);
        printf("%s\n",str1);
    }
    else
    {
        while(str2[i]!='\0')
        {
            if(str1[i]!='\0')
            {
                sum=str2[i]-'0'+str1[i]-'0'+flag;
                if(sum>9)
                {
                    flag=1;
                    str2[i]=sum-10+'0';
                }
                else
                {
                    flag=0;
                    str2[i]=sum+'0';
                }
            }
            else
            {
                sum=str2[i]-'0'+flag;
                if(sum>9)
                {
                    flag=1;
                    str2[i]=sum-10+'0';
                }
                else
                {
                    flag=0;
                    str2[i]=sum+'0';
                }                
            }
            i++;
        }
        if(flag)
        {
            str2[i]='1';
            len2++;
        }
        reverse_order(str2,len2);
        printf("%s\n",str2);
    }
    return 0;
}

发表于 2022-04-29 10:39:22 回复(0)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>


void fun(char *str,int len){
    int i=0;
    char temp ='0';
    for(i=0;i<len/2;i++){
        temp = str[i];
        str[i] = str[len-1-i];
        str[len-1-i] = temp;
    }
}

int main(void){
    char str1[10001] = {0};
    char str2[10001] = {0};
    int data[10001] = {0};
    int len1,len2,len;
    int flag = 0; //进位标志
    int i=0,j=0,temp=0;
    while(scanf("%s%s",str1,str2) != EOF){
        len1 = strlen(str1);
        len2 = strlen(str2);
        fun(str1,len1);
        fun(str2,len2);
        len = len1>len2?len1:len2;
        
        for(i=0;i<len;i++){
            if(i<len1 && i<len2 )
                 temp = str1[i] - '0' + str2[i] - '0' + flag;   
            if(i>=len2)
                 temp = str1[i] - '0' + flag;
            if(i>=len1) 
                 temp = str2[i] - '0' + flag;            
            data[i] = temp%10;
            flag = temp/10;    
        }
        if(flag == 1){
            data[i++] = 1;
        }    
        while(i--)
            printf("%d",data[i]);

    }       
    return 0;
}


发表于 2022-04-18 22:48:23 回复(0)
#include <stdio.h>
#include <string.h>

int main(){
    char str1[10000], str2[10000], res[10000], temp;
    int i, j, len1, len2, ntemp;
    memset(str1, 0, 1000);
    memset(str2, 0, 1000);
    memset(res, 0, 1000);
    while(scanf("%s\n%s", str1, str2) != EOF){
        len1 = strlen(str1);
        len2 = strlen(str2);
        if(len1 < len2){//长的为str1统一处理
            char temp[10000];
            strcpy(temp, str1);
            strcpy(str1, str2);
            strcpy(str2, temp);
            ntemp = len1;//长度交换
            len1 = len2;
            len2 = ntemp;
        }
        i = len1 - 1;
        for(j=len2-1; j>=0; j--){//直接对位相加超过9 为相应的ascii值
            temp = str1[i] + (str2[j]-'0');
            res[i] = temp;
            i--;
        }
        while(i>=0){//长度不一致时输出长的部分
            res[i] = str1[i];
            i--;
        }
        for(i=len1-1; i>0; i--){//处理大于9的部分不包括最高位
            if(res[i] > '9'){
                res[i] -= 10;//变回ascii码对应的数字
                res[i-1]++;
            }
        }
        if(res[0] > '9'){//处理最高位
            printf("1");//偷懒直接输出1(因为进位了)
            res[0] -= 10;//变回ascii码对应的数字
        }
        for(i=0; i<len1; i++){//逐一输出后续
            printf("%c", res[i]);
        }
    }
    return 0;
}

发表于 2022-03-26 12:12:39 回复(0)
#include <stdio.h>
void nixu(char*str,int len)
{
    int left=0,right=len-1;
    char tmp;
    while(left<right)
    {
        tmp=str[left];
        str[left]=str[right];
        str[right]=tmp;
        left++;
        right--;
    }
}
int main()
{
    char str1[10000]={0};
    char str2[10000]={0};
    int  ztr1[10000]={0};
    int  ztr2[10000]={0};
    int   sum[10000]={0};
    int i;
    scanf("%s",str1);
    scanf("%s",str2);
    nixu(str1,strlen(str1));
    nixu(str2,strlen(str2));
    for(i=0;i<strlen(str1);i++)
    {
        ztr1[i]=str1[i]-'0';
    }
    for(i=0;i<strlen(str2);i++)
    {
        ztr2[i]=str2[i]-'0';
    }
    if(strlen(str1)>=strlen(str2))
    {
        for(i=0;i<strlen(str1);i++)
        {
            if(sum[i]+ztr1[i]+ztr2[i]<10)
                sum[i]+=ztr1[i]+ztr2[i];
            else
            {
                sum[i]+=ztr1[i]+ztr2[i]-10;
                sum[i+1]++;
            }
        }
        if(sum[strlen(str1)]!=0)
            printf("%d",sum[strlen(str1)]);
        for(i=strlen(str1)-1;i>=0;i--)
            printf("%d",sum[i]);
    }
    else
    {
        for(i=0;i<strlen(str2);i++)
        {
            if(sum[i]+ztr1[i]+ztr2[i]<10)
                sum[i]+=ztr1[i]+ztr2[i];
            else
            {
                sum[i]+=ztr1[i]+ztr2[i]-10;
                sum[i+1]++;
            }
        }
        if(sum[strlen(str2)]!=0)
            printf("%d",sum[strlen(str2)]);
        for(i=strlen(str2)-1;i>=0;i--)
            printf("%d",sum[i]);
    }
    return 0;
}
发表于 2022-03-18 11:02:12 回复(0)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
	

char a[10004] = { 0 };
	char b[10004] = { 0 };
	int arr[10004] = { 0 };
	int brr[10004] = { 0 };
	int crr[10004] = { 0 };


int main()
{

	int s1, s2,max;
	int i,j,k;
	while (scanf("%s", a) != EOF)
	{
		scanf("%s", b);
		
		if (a[0] == '0' && b[0] == '0')
			printf("0\n");
		else {

			s1 = strlen(a);
			s2 = strlen(b);

			if (s1 > s2)
				max = s1;
			else
				max = s2;

			for (i = max,j=s1-1,k=s2-1; i >= 0; i--,j--,k--)
			{
				
				if (j>=0)
					arr[i] = a[j] - '0';
				else
					arr[i] = 0;
				if (k >= 0)
					brr[i] = b[k] - '0';
				else
					brr[i] = 0;

			}

			for (i = max; i >= 0; i--)
			{
				crr[i] = crr[i] + brr[i] + arr[i];
				if (crr[i] > 9)
				{
					crr[i] = crr[i] % 10;
					crr[i - 1]++;
				}
			}

			int flag = 0;
			for (i = 0; i <= max; i++)
			{
				if (crr[i] != 0)
					flag = 1;
				if (flag == 1)
					printf("%d", crr[i]);
			}
			printf("\n");
			memset(arr, 0, sizeof(arr));
			memset(brr, 0, sizeof(arr));
			memset(crr, 0, sizeof(arr));
		}

	}

	return 0;
}

发表于 2022-02-03 20:51:15 回复(0)
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

void Reverse_Sequence(char *str, int len);

int main()
{
    char str1[10000] = {0};
    char str2[10000] = {0};
    char str3[10010] = {0};
    int len1, len2, Len_Max;
    int carry, Carry_Flag, sum;

    while(scanf("%s%s", str1,str2) != EOF)
    {
        
        len1 = strlen(str1);
        len2 = strlen(str2);
        Len_Max = (len1>=len2) ? len1 : len2;
        Reverse_Sequence(str1, len1);
        Reverse_Sequence(str2, len2);
        
        /*加法*/
        Carry_Flag = 0;
        for(int i=0; i <= Len_Max; i++)
        {
        //    if(str1[i] == '\0') str1[i] = '0';    //上一次输入有脏数据,故循环结束需要用memset
         //   if(str2[i] == '\0') str2[i] = '0';    //上一次输入有脏数据,故循环结束需要用memset
            if(i>len1-1)     str1[i] = '0';
            if(i>len2-1)     str2[i] = '0';
            
            sum = str1[i] + str2[i] - '0' - '0' + Carry_Flag;
            if(sum > 9)
            {
                str3[i] = sum%10+'0';
                Carry_Flag = 1;
            }
            else
            {
                str3[i] = sum%10+'0';
                Carry_Flag = 0;
            }
            
        }
        if(str3[Len_Max] == '0')
        {
            for(int i=Len_Max-1; i>=0; i--)
            {
                printf("%c", str3[i]);
            }
            
        }
        else
        {
            for(int i=Len_Max; i>=0; i--)
            {
                printf("%c", str3[i]);
            }
        }
        printf("\n");
    //    memset(str1, 0, 10000);
     //   memset(str2, 0, 10000);
    }
    return 0;
}

/*数组逆序*/
void Reverse_Sequence(char *str, int len)
{
    char temp;
    int front, rear;
    front=0,rear=len-1;
    while(front < rear)
    {
        temp = str[front];
        str[front] = str[rear];
        str[rear] = temp;
        front++;
        rear--;
    }
}

发表于 2021-08-30 18:05:03 回复(0)