问题描述
输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。
//高精度加法
#include <stdio.h>
#define N 100
int Scanner(char T[])
{
int i=0;
scanf("%c",&T[i++]);
while(T[i-1]>='0'&&T[i-1]<='9'){
scanf("%c",&T[i++]);
}
return (i);
}
void px(char x[],int n)
{
int i = 0;
for(i;i<n-i;i++){
char t = x[i];
x[i] = x[n-i-1];
x[n-i-1] = t;
}
}
void Print_String(char max_s[],char min_s[],int max,int min)
{
int i;
for(i=0;i<min;i++){
max_s[i]-=48;
min_s[i]-=48;
max_s[i]+=min_s[i];
if(max_s[i]>9){
max_s[i]-=10;
max_s[i+1]+=1;
}
}
if(max_s[i]==1){
printf("1");
}
for(max;max>0;max--){
if(max_s[max-1]>47){
printf("%d",max_s[max-1]-48);
}
else if(max_s[max-1]<0){
break;
}
else{
printf("%d",max_s[max-1]);
}
}
}
int main()
{
char a[N],b[N];
int a_xb = Scanner(a);
int b_xb = Scanner(b);
px(a,a_xb);
px(b,b_xb);
if(a_xb<b_xb){
Print_String(b,a,b_xb,a_xb);
}else{
Print_String(a,b,a_xb,b_xb);
}
return 0;
}
这个是蓝桥杯里 的一个习题,在提交的时候显示错误,请问我这个在哪里还有缺陷,我已经找不到了擦,
在我的输出函数中,最后一个字符为负数,这是为什么,
#include<stdio.h>
#include<string.h>
char c[1002]={0};
int a[1000]={0};
int b[1000]={0};
int sum(int a[],int c1,int b[],int c2){
int n=0;
int r=0;
bool flag = true;
for(int i=0;i<=c1;i++){
int d = 0;
if(i<c2){
d = a[i]+b[i]+r;
}else if(i<c1){
if(r==0){
n=c1;
c[i]=a[i]+'0';
flag=false;
//break;
}else{
d=a[i]+r;
}
}else if(r>0){
c[c1]='1';
n=c1+1;
break;
}
r=0;
if(flag){
if(d>=10){
r=1;
c[i]=(d-10)+'0';
}else{
c[i]=d+'0';
}
}
}
return n;
}
int main(){
int i,c1,z,c2;
printf("请输入a的值:");
scanf("%s",c);
c1=strlen(c);
for(i=0;i<=c1-1;i++){
a[c1-1-i]=c[i]-'0';
}
printf("请输入b的值:");
scanf("%s",c);
c2=strlen(c);
for(i=0;i<=c2-1;i++){
b[c2-1-i]=c[i]-'0';
}
if(c1>=c2){
z=sum(a,c1,b,c2);
}else{
z=sum(b,c2,a,c1);
}
for(i=z-1;i>=0;i--)
printf("%c",c[i]);
return 0;
}
#include <stdio.h>
#include <string.h>
#define N 1000
int main() {
char ch1[N],ch2[N];
scanf("%s %s",ch1,ch2);
int len1=strlen(ch1),len2=strlen(ch2);
if(len1==1 && len2==1 && ch1[0]=='0' && ch2[0]=='0') {
//注意零相加的时候特殊情况
// cout<<'0';
printf("0");
return 0;
}
int a[N]= {0},b[N]= {0};
if(len1>=len2) {
for(int i=2; i<=len1+1; i++)
a[i]=ch1[i-2]-'0';
len1+=2; //下标从2开始,留出进位空间
for(int i=0; i<len2; i++)
b[i]=ch2[len2-i-1]-'0';
while(len2<len1) //将两个加数的位数置同
len2++;
for(int i=0; i<len1; i++) { //各位相加;
a[len1-i-1]+=b[i];
if(a[len1-i-1]>=10) { //向前进位
a[len1-i-1]%=10;
a[len1-i-2]++;
}
}
} else {
for(int i=2; i<=len2+1; i++)
a[i]=ch2[i-2]-'0';
len2+=2;
for(int i=0; i<len1; i++)
b[i]=ch1[len1-i-1]-'0';
while(len1<len2) //将两个加数的位数置同
len1++;
for(int i=0; i<len2; i++) { //各位相加;
a[len2-i-1]+=b[i];
if(a[len2-i-1]>=10) { //向前进位
a[len2-i-1]%=10;
a[len2-i-2]++;
}
}
}
int i=0;
while(1) { //去除前面不必要的零
if(a[i]) break;
else i++;
}
for(i; i<len1; i++) //cout<<a[i];
printf("%d",a[i]);
return 0;
}
仅供参考,有帮助希望采纳