#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main() {
char str1[10000];
char str2[10000];
while (scanf("%s %s", str1, str2) != EOF) {
int len1 = strlen(str1);
int len2 = strlen(str2);
int num1[len1+1]; //给首位满十进一预留
int num2[len2+1]; //给首位满十进一预留
int num3[10001]; //用来存储相加后每一项的数组
int num4[10001]; //用来将长度较短数组增加数组前面为0的个数,使得长度与较长数组一致,好计算num3数组
int i,j;
int a = 0;
for(i=0;i<=len1;i++)
{
if(i == 0)
num1[i] = 0; //数组第一位赋值为0
else
num1[i] = str1[i-1] - '0'; //数组第二位至最后一位是str1数组中的每一项
}
for(i=0;i<=len2;i++)
{
if(i == 0)
num2[i] = 0;
else
num2[i] = str2[i-1] - '0'; //数组第二位至最后一位是str2数组中的每一项
}
if(len1>=len2)
{
for(i=len1;i>=0;i--)
{
if(i>=len1-len2 && i<=len1) num4[i] = num2[i-len1+len2]; //num2复制给num4的从len1-len2到len1项
if(i>=0 && i<len1-len2) num4[i] = 0; //num4从0到len1-len2-1项全部赋值0
num3[i] = num1[i] + num4[i] + a; //a 存在是为了满十进一
if(num3[i] > 9 )
{
num3[i] = num3[i] - 10; //满十进一后的值
a = 1;
}
else a = 0;
}
for(i=0;i<1;i++)
{
if(num3[i] != 0)
printf("%d",num3[i]); //num3首位非零就全部输出
else break;
}
for(i=1;i<=len1;i++)
{
printf("%d",num3[i]); //num3首位为零就将去掉首位,输出其他
}
}
if(len1<len2)
{
for(i=len2;i>=0;i--)
{
if(i>=len2-len1 && i<=len2) num4[i] = num1[i-len2+len1]; //num1复制给num4的从len2-len1到len2项
if(i>=0 && i<len2-len1) num4[i] = 0; //num4从0到len2-len1-1项全部赋值0
num3[i] = num2[i] + num4[i] + a;
if(num3[i] > 9 )
{
num3[i] = num3[i] - 10;
a = 1;
}
else a = 0;
}
for(i=0;i<1;i++)
{
if(num3[i] != 0)
printf("%d",num3[i]);
else break;
}
for(i=1;i<=len2;i++)
{
printf("%d",num3[i]);
}
}
}
return 0;
} #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;
} #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;
}
觉得不错的话就点个赞吧! #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;
} 在本地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;
}
#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;
} #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;
} #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;
} #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;
}
#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--;
}
}