题解
本题中要求用字符串模拟大数的加法。直接将较短的串加到较长的串上,然后输出长串后就是相加的结果。在模拟加法时会遇到进位的操作,当两串中的字符相加大于10就会进1,此时如果长串中的下一位是9的话则又要进一,所以可以用一个while解决进位的操作,判断表达式就是下一位是否是9。
题目
问题 E: long long long 之加法运算
时间限制: 1 Sec 内存限制: 32 MB
提交: 1980 解决: 542
[ 提交] [ 状态] [ 讨论版]
题目描述
张老师班的小刘编程时想用long long long 型定义比LONG_LONG_MAX还要大的数并参与运算,但GCC表示“error: 'long long long' is too long for GCC”,于是他(这可咋整呀. jpg)地找到了你,希望你帮他解决这个问题。
当然想完整地完成long long long 型变量的各种运算还是有些难度的,于是他给你设了个小目标,希望你先帮他解决long long long 型定义的正整数变量之间的加法运算就可以了。
输入
测试输入有多行:
第1 行:输入测试组数t
第2 至t+ 1 行:输入两个正整数A B(A,B 均不超过1000 位)
(PS: 没错long long long 型就是可以表示这么大的数[ 手动滑稽] )
输出
每组数据输出两行:
第一行:输出“Case i: ”,其中i代表第i组输出数据
第二行:输出“A + B = C”,其中C为A+ B的运算结果
!注意:每组数据输出之间有空行,最后一组输出后没有空行(即没有"\n\n" , 只有"\n" ),具体输出格式见样例
样例输入
2
1 2
2 3
样例输出
Case 1 :
1 + 2 = 3
Case 2 :
2 + 3 = 5
提示
将输入的两个正整数都视为字符串,编程模拟人工手算两个正整数的加法即可。
代码块
#include <stdio.h>
#include <string.h>
char a[ 2000 ] , b[ 2000 ] ;
void function2 ( int k, char * c)
{
while ( c[ k- 1 ] == '9' )
{
c[ k- 1 ] = '0' ;
k-- ;
}
c[ k- 1 ] + = 1 ;
if ( ! k)
printf ( "1" ) ;
}
void function1 ( )
{
int i = ( int ) strlen ( a) - 1 , j = ( int ) strlen ( b) - 1 ;
printf ( "%s + %s = " , a, b) ;
if ( i>= j)
{
while ( j!= - 1 )
{
if ( ( a[ i] - 48 ) + ( b[ j] - 48 ) >= 10 )
{
a[ i] = ( ( a[ i] - 48 ) + ( b[ j] - 48 ) ) % 10 + 48 ;
function2 ( i, a) ;
}
else
a[ i] + = ( b[ j] - 48 ) ;
i-- ;
j-- ;
}
printf ( "%s\n" , a) ;
}
else
{
while ( i!= - 1 )
{
if ( ( a[ i] - 48 ) + ( b[ j] - 48 ) >= 10 )
{
b[ j] = ( ( b[ j] - 48 ) + ( a[ i] - 48 ) ) % 10 + 48 ;
function2 ( j, b) ;
}
else
b[ j] + = ( a[ i] - 48 ) ;
i-- ;
j-- ;
}
printf ( "%s\n" , b) ;
}
}
int main ( void )
{
int i, t;
scanf ( "%d" , & t) ;
for ( i= 0 ; i< t; i++ )
{
scanf ( "%s%s" , a, b) ;
printf ( "Case %d:\n" , i+ 1 ) ;
function1 ( ) ;
if ( i!= t- 1 )
printf ( "\n" ) ;
}
}