一、题目描述
二、输入样例
1 1
三、输出样例
2
四、思路
是道oj上的作业题
太复杂了
做完加法还有一大半过不了
才发现还有负数的情况
因为整型变量局限的问题
所以肯定是用字符串的方式输入
我的分法一共是三种(但最后还是做了四种)
1.正数 正数(最原始版本)
2.负数 负数(去掉负号做加法)
3.一正 一负
1.正数+正数
输入字符串str1
输入字符串str2
计算字符串长度str1_len=strlen(str1)
计算字符串长度str2_len=strlen(str2)
算出数字更大的一个声明为len_max
倒序输出str1 将其每个字符元素变为整型 存入整型数组a中
倒序输出str2 将其每个字符元素变为整型 存入整型数组b中
定义一个整型数组c作为结果
定义一个k 作为进位(记得先初始化为0)
将(a[i]+b[i]+k)%10 作为结果放进c[i]中
将(a[i]+b[i]+k)/ 10 作为k进入下一步计算中
最后 如果 k>1的话 就先输出k
注意:
1、要先把a和b全部初始化为0,不然可能会有个比较短的数组的位置上没有数字,相加的时 候可能就会出问题
2、还有就是 其实我一开始没有倒序去存入数组
这样就会有溢出的时候没有办法解决的问题出现
例如 90 + 80 = 170
3、在字符串转换为整型数组的时候
i 从 str1_len-1 到 0( i 代指的是字符串下标)
例如长度为5
数到 str1 [4] 就够了
代码实现
if(str1[0]!='-'&&str2[0]!='-'){
str1_len=strlen(str1);
str2_len=strlen(str2);
for(i = 0, j = str1_len - 1; j >= 0; i++, j--) /*将字符数组逆序转换为整形数组*/
{
a[i] = str1[j] -'0';
}
for(i = 0, j = str2_len - 1; j >= 0; i++, j--)
{
b[i] = str2[j] -'0';
}
len_max=str1_len>str2_len?str1_len:str2_len;
for(i=0;i<len_max;i++){
c[i]=(a[i]+b[i]+k)%10;
k=(a[i]+b[i]+k)/10;
}
if(k!=0){
printf("%d",k);
}
for(i=len_max-1;i>=0;i--){
printf("%d",c[i]);
}
}
2.负数 + 负数
和1其实没啥差 就是把在做转换为整型数组的时候把str1[0] str2[0]去掉
else if(str1[0]=='-'&&str2[0]=='-'){
str1_len=strlen(str1);
str2_len=strlen(str2);
for(i = 0, j = str1_len - 1; j > 0; i++, j--) /*将字符数组逆序转换为整形数组*/
{
a[i] = str1[j] -'0';
}
for(i = 0, j = str2_len - 1; j > 0; i++, j--) /*去掉j=0*/
{
b[i] = str2[j] -'0';
}
len_max=str1_len>str2_len?str1_len:str2_len;
for(i=0;i<len_max-1;i++){ /*做加法时去掉一位*/
c[i]=(a[i]+b[i]+k)%10;
k=(a[i]+b[i]+k)/10;
}
printf("-"); /*先输出-*/
if(k!=0){
printf("%d",k);
}
for(i=len_max-2;i>=0;i--){
printf("%d",c[i]);
}
}
3. 一正 + 一负(大数减法)
两个数分成 被减数 和 减数
这里默认为str1为正 str2为负
前面的步骤都是一样的
不过 减数长度会减一(把减号去掉)
先判断这两个一不一样
如果完全相同就直接输出0
否则则判断两个数的模哪一个更大
引入n
当长度不同时 长度长的字符串对应的数字一定更大
如果str1长 n>0
如果str2长 n<0
长度相同时 引入库函数strcmp(不过需要注意要把减数去掉负号再放进来)
如果n>0 就|str1|-|str2|
如果n<0 就|str2|-|str1| 最后输出前加个符号
减法运算
当n>0时
当a[i]-b[i]>0时
c[i]=a[i]-b[i]
当a[i]-b[i]<0时
c[i]=a[i]+10-b[i]
a[i+1] - -
还有需要注意的点是
例如 1800 - 1788 = 12
c = 0021
要把头的0消除掉
代码实现
else if(str2[0]=='-'){
str1_len = strlen(str1);
str2_len = strlen(str2)-1;
for(i = 0, j = 1 ; j <= str2_len; i++, j++)
{
str2[i] = str2[j];
}
len_max=str1_len>str2_len?str1_len:str2_len;
if(str1_len>str2_len)
n = 1;
else if(str1_len==str2_len)
n = strcmp(str1,str2);
else
n = -1;
for(i = 0, j = str1_len - 1; j >= 0; i++, j--) /*将字符数组逆序转换为整形数组*/
{
a[i] = str1[j] -'0';
}
for(i = 0, j = str2_len -1; j >= 0; i++, j--)
{
b[i] = str2[j] -'0';
}
if(str1_len==str2_len){
for(i=0;i<str1_len;i++){
if(a[i]==b[i]){
flag=0;
}
else{
flag=1;
break;
}
}
}
if(flag==0){
printf("%d",0);
}else{
for(i=0; i<len_max; i++)
{
if(n>=0)
{
if(a[i]-b[i] >= 0)
c[i] = a[i] - b[i];
else
{
c[i] = a[i] + 10 - b[i];
a[i+1]--;
}
}
else
{
if(b[i]-a[i] >= 0)
c[i] = b[i] - a[i];
else
{
c[i] = b[i] + 10 - a[i];
b[i+1]--;
}
}
}
if(n<0)
printf("-");
for(i=len_max-1;i>=0;i--){
if(c[i]==0){
cnt++;
}
else
break;
}
for(i=len_max-1-cnt;i>=0;i--){
printf("%d",c[i]);
}
}
}
五、代码实现
#include<stdio.h>
#include<string.h>
char str1[100];
char str2[100];
int a[100];
int b[100];
int c[100];
int main()
{
int i,j,k=0,str1_len,str2_len,len_max,cnt=0,n,flag=1;
for(i=0;i<100;i++){ /*将整型数组a全部赋值为0*/
a[i]=0;
}
for(i=0;i<100;i++){ /*将整型数组b全部赋值为0*/
b[i]=0;
}
scanf("%s %s",&str1,&str2);
if(str1[0]!='-'&&str2[0]!='-'){
str1_len=strlen(str1);
str2_len=strlen(str2);
for(i = 0, j = str1_len - 1; j >= 0; i++, j--) /*将字符数组逆序转换为整形数组*/
{
a[i] = str1[j] -'0';
}
for(i = 0, j = str2_len - 1; j >= 0; i++, j--)
{
b[i] = str2[j] -'0';
}
len_max=str1_len>str2_len?str1_len:str2_len;
for(i=0;i<len_max;i++){
c[i]=(a[i]+b[i]+k)%10;
k=(a[i]+b[i]+k)/10;
}
if(k!=0){
printf("%d",k);
}
for(i=len_max-1;i>=0;i--){
printf("%d",c[i]);
}
}
else if(str1[0]=='-'&&str2[0]=='-'){
str1_len=strlen(str1);
str2_len=strlen(str2);
for(i = 0, j = str1_len - 1; j > 0; i++, j--) /*将字符数组逆序转换为整形数组*/
{
a[i] = str1[j] -'0';
}
for(i = 0, j = str2_len - 1; j > 0; i++, j--)
{
b[i] = str2[j] -'0';
}
len_max=str1_len>str2_len?str1_len:str2_len;
for(i=0;i<len_max-1;i++){
c[i]=(a[i]+b[i]+k)%10;
k=(a[i]+b[i]+k)/10;
}
printf("-");
if(k!=0){
printf("%d",k);
}
for(i=len_max-2;i>=0;i--){
printf("%d",c[i]);
}
}
else if(str2[0]=='-'){
str1_len = strlen(str1);
str2_len = strlen(str2)-1;
for(i = 0, j = 1 ; j <= str2_len; i++, j++)
{
str2[i] = str2[j];
}
len_max=str1_len>str2_len?str1_len:str2_len;
if(str1_len>str2_len)
n = 1;
else if(str1_len==str2_len)
n = strcmp(str1,str2);
else
n = -1;
for(i = 0, j = str1_len - 1; j >= 0; i++, j--) /*将字符数组逆序转换为整形数组*/
{
a[i] = str1[j] -'0';
}
for(i = 0, j = str2_len -1; j >= 0; i++, j--)
{
b[i] = str2[j] -'0';
}
if(str1_len==str2_len){
for(i=0;i<str1_len;i++){
if(a[i]==b[i]){
flag=0;
}
else{
flag=1;
break;
}
}
}
if(flag==0){
printf("%d",0);
}else{
for(i=0; i<len_max; i++)
{
if(n>=0)
{
if(a[i]-b[i] >= 0)
c[i] = a[i] - b[i];
else
{
c[i] = a[i] + 10 - b[i];
a[i+1]--;
}
}
else
{
if(b[i]-a[i] >= 0)
c[i] = b[i] - a[i];
else
{
c[i] = b[i] + 10 - a[i];
b[i+1]--;
}
}
}
if(n<0)
printf("-");
for(i=len_max-1;i>=0;i--){
if(c[i]==0){
cnt++;
}
else
break;
}
for(i=len_max-1-cnt;i>=0;i--){
printf("%d",c[i]);
}
}
}
else {
str1_len = strlen(str1)-1;
str2_len = strlen(str2);
len_max=str1_len>str2_len?str1_len:str2_len;
for(i = 0, j = 1 ; j <= str1_len; i++, j++)
{
str1[i] = str1[j];
}
if(str2_len>str1_len)
n = 1;
else if(str2_len==str1_len)
n = strcmp(str2,str1);
else
n = -1;
for(i = 0, j = str2_len -1; j >= 0; i++, j--) /*将字符数组逆序转换为整形数组*/
{
a[i] = str2[j] -'0';
}
for(i = 0, j = str1_len -1; j >= 0; i++, j--)
{
b[i] = str1[j] -'0';
}
//printf("\n");
if(str1_len==str2_len){
for(i=0;i<str1_len;i++){
if(a[i]==b[i]){
flag=0;
}
else{
flag=1;
break;
}
}
}
if(flag==0){
printf("%d",0);
}else{
for(i=0; i<len_max; i++)
{
if(n>=0)
{
if(a[i]-b[i] >= 0)
c[i] = a[i] - b[i];
else
{
c[i] = a[i] + 10 - b[i];
a[i+1]--;
}
}
else
{
if(b[i]-a[i] >= 0)
c[i] = b[i] - a[i];
else
{
c[i] = b[i] + 10 - a[i];
b[i+1]--;
}
}
}
if(n<0)
printf("-");
for(i=len_max-1;i>=0;i--){
if(c[i]==0){
cnt++;
}
else
break;
}
for(i=len_max-1-cnt;i>=0;i--){
printf("%d",c[i]);
}
}
}
return 0;
}