输入两个用字符串 str 表示的整数,求它们所表示的数之和。
数据范围:
#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--; } }