#include<stdio.h>
#include<string.h>
#define size 1001
int main()
{
char str1[size],str2[size],*num1,*num2,*p1,*p2;
int ncase/*多组输入数目*/,mcase=1/*输出时的第几个输出计数器*/,up/*进位存储器*/,len1,len2,len;
scanf("%d",&ncase);
while(ncase--)
{
scanf("%s %s",str1,str2);
printf("case %d:\n",mcase++);
printf("%s + %s = ",str1,str2);
len1=strlen(str1);/*分别计算两数长度*/
len2=strlen(str2);
if( len1 >= len2 )/*把num1赋较大数的数组首地址num2赋较小数的数组首地址,且保证len1存长数组长度len2存短数组长度*/
{
num1=str1;
num2=str2;
}
else
{
num1=str2;
num2=str1;
len=len1;
len1=len2;
len2=len;
}
up=0;/*进位赋初值0*/
for(p1=num1+len1-1,p2=num2+len2-1;p1>=num1;p1--,p2--)/*从各自最小位逐位相加,以较大数的最高位为边界*/
{
if( p2 < num2 )/*当高位无数时补0*/
*p2=48;
*p1=*p1+*p2-96+up;/*由ascII码值化为十进制值*/
up=0;
if( *p1 >= 10 )/*如果此位相加结果十进制值大于10则作减10处理*/
{
*p1-=10;
up=1;/*进位寄存器赋1*/
}
*p1+=48;/*再次化为ascII码以供输出*/
}
if( up == 1 )/*当最高位加上进位仍产生进位则需于前再输出一个“1”*/
printf("1");
printf("%s\n",num1);/*输出经加法处理改动的大数组*/
if( ncase != 0 )
printf("\n");
}
return 0;
}
|
|
| 40分 |
修改如下:
#include<stdio.h>
#include<string.h>
#define size 1001
int main()
{
char str1[size], str2[size], *num1, *num2, *p1, *p2;
int ncase/*多组输入数目*/, mcase = 1/*输出时的第几个输出计数器*/, up/*进位存储器*/, len1, len2, len;
scanf("%d", &ncase);
while (ncase--)
{
scanf("%s %s", str1, str2);
printf("case %d:\n", mcase++);
printf("%s + %s = ", str1, str2);
len1 = strlen(str1);/*分别计算两数长度*/
len2 = strlen(str2);
if (len1 >= len2)/*把num1赋较大数的数组首地址num2赋较小数的数组首地址,且保证len1存长数组长度len2存短数组长度*/
{
num1 = str1;
num2 = str2;
}
else
{
num1 = str2;
num2 = str1;
len = len1;
len1 = len2;
len2 = len;
}
up = 0;/*进位赋初值0*/
//for (p1 = num1 + len1 - 1, p2 = num2 + len2 - 1; p1 >= num1; p1--, p2--)/*从各自最小位逐位相加,以较大数的最高位为边界*/
for (p1 = num1 + len1 - 1, p2 = num2 + len2 - 1; p2 >= num2; p1--, p2--)/*从各自最小位逐位相加,以较大数的最高位为边界*/
{
//if (p2 < num2)/*当高位无数时补0*/
// *p2 = 48;
*p1 = *p1 + *p2 - 96 + up;/*由ascII码值化为十进制值*/
up = 0;
if (*p1 >= 10)/*如果此位相加结果十进制值大于10则作减10处理*/
{
*p1 -= 10;
up = 1;/*进位寄存器赋1*/
}
*p1 += 48;/*再次化为ascII码以供输出*/
}
if (up == 1)/*当最高位加上进位仍产生进位则需于前再输出一个“1”*/
//printf("1");
{
while (p1 >= num1)
{
*p1 += 1;
if (*p1 > ""9"")
{
*p1 = ""0"";
up = 1;
p1--;
}
else break; //无进位,直接跳出
}
if (p1 < num1) printf("1");
}
printf("%s\n", num1);/*输出经加法处理改动的大数组*/
if (ncase != 0)
printf("\n");
}
return 0;
}
|
|
可是我的并没有什么不对啊
|
|
|
楼主的代码中,随着p2不断减少,极有可能越过最小边界。
试一下,测试用例 999999999999999 + 9 |
|
|
然而事实证明我的16位的9加 上9结果还是对的 -_-||…
|
|
|
仅供参考:
#include <stdio.h>
#include <string.h>
#define MAXLEN 1000
char a1[MAXLEN];
char a2[MAXLEN];
static int v1[MAXLEN];
static int v2[MAXLEN];
static int v3[MAXLEN];
int i,j,n,L,z;
void main(void) {
scanf("%d",&n);
for (j=0;j<n;j++) {
scanf("%s%s",a1,a2);
L=strlen(a1);
for (i=0;i<L;i++) v1[i]=a1[L-1-i]-""0"";
L=strlen(a2);
for (i=0;i<L;i++) v2[i]=a2[L-1-i]-""0"";
for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i];
for (i=0;i<MAXLEN;i++) {
if (v3[i]>=10) {
v3[i+1]+=v3[i]/10;
v3[i]=v3[i]%10;
}
}
printf("Case %d:\n", j+1);
printf("%s + %s = ", a1, a2);
z=0;
for (i=MAXLEN-1;i>=0;i--) {
if (z==0) {
if (v3[i]!=0) {
printf("%d",v3[i]);
z=1;
}
} else {
printf("%d",v3[i]);
}
}
if (z==0) printf("0");
printf("\n");
}
}
//Sample Input
//3
//0 0
//1 2
//112233445566778899 998877665544332211
//
//Sample Output
//Case 1:
//0 + 0 = 0
//Case 2:
//1 + 2 = 3
//Case 3:
//112233445566778899 + 998877665544332211 = 1111111111111111110
|
|