先看题目:
题目叫“小学生算术”,哈哈哈,一看题目感觉大学生不会做小学生的算术了(开个玩笑)。
这题给我的第一印象是用字符串解决,因为想了一下如果直接用整数来解决这个题目的话特别麻烦(其中包括不断取余得到每个位置上的数字,还涉及了一系列无法描述的操作,总之很难实现) 。
下面是AC代码及注释:
#include<stdio.h>
#include<string.h>
int main()
{
char a[50000],b[50000];
while (scanf("%s%s",a,b)!=EOF)
{
int lena=strlen(a),lenb=strlen(b);
int min,max;
if (lena<=lenb) //比较两个字符串的长度,方便后续的操作
{
min=lena;
max=lenb;
}
else
{
min=lenb;
max=lena;
}
int cnt=0,t=0,i=min-1,j=max-1; //cnt记录进位次数,t表示上一次两个数相加是否进位,若进位,则t=1,此次计算除两数相加外还要加1,若未进位,t=0
if (min==lena) //还需要注意的是是从数组最后一个元素开始相加,而不是从第一个元素开始
{
for ( i; i>=0; i--)
{
for (j; j>=0; )
{
if (t==0)
{
if (a[i]-48+(b[j]-48)>'9'-48) //将数字转换成ASCII值的0-9(比如1的ASCII为49,将其转换为ASCII为1),若两个相加大于9,则进位,下面的操作类似
{
cnt++;
t=1;
}
}
else if(t==1)
{
if (a[i]-48+(b[j]-48)+'1'-48>'9'-48)
{
cnt++;
t=1;
}
else t=0;
}
j--;
break; //因为每次只加一个数,因此在执行完一次循环后需要跳出内层循环继续下一次的大循环
}
}
}
else
{
for ( i; i>=0; i--)
{
for (j; j>=0; j--)
{
if (t==0)
{
if (a[j]-48+(b[i]-48)>'9'-48)
{
cnt++;
t=1;
}
}
else if(t==1)
{
if (a[j]-48+(b[i]-48)+'1'-48>'9'-48)
{
cnt++;
t=1;
}
else t=0;
}
j--;
break;
}
}
}
if (t==1)
{
if (max==lena)
{
for (j; j>=0&&t==1; j--) //若两个字符串长度不相等且t=1的话较长的字符串还需要进行加法,然后判断是否还需要进位
{
if (a[j]-48+('1'-48)>'9'-48)
{
cnt++;
t=1;
}
else t=0;
}
}
else if (max==lenb)
{
for (j; j>=0&&t==1; j--)
{
if (b[j]-48+('1'-48)>'9'-48)
{
cnt++;
t=1;
}
else t=0;
}
}
}
printf("%d\n",cnt);
}
}
第二次做后优化了一下代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char a[100];
char b[100];
while (scanf("%s",a)!=EOF)
{
scanf("%s",b);
int len1=strlen(a);
int len2=strlen(b);
int cnt=0;
int j=len2-1;
int i=len1-1;
int len;
if (len1>len2)
len=len1;
else len=len2;
while (j>=0||i>=0)
{
if (i<0)
{
if (b[j]-'0'>9)
{
cnt++;
b[j-1]+=1;
}
}
else if (j<0)
{
if (a[i]-'0'>9)
{
cnt++;
a[i-1]+=1;
}
}
else
{
if (a[i]+b[j]-'0'-'0'>9)
{
cnt++;
if (len==len1)
a[i-1]+=1;
else if(len==len2)
b[j-1]+=1;
}
}
i--;
j--;
}
printf("%d\n",cnt);
}
}
如果有不同的意见或建议欢迎大家在评论区提出!
继续加油!!!