整数的大数加减
来源:互联网 发布:常用的数据分析模型 编辑:程序博客网 时间:2024/05/22 20:07
萌新的整数大数加减
大致思路:
数据输入 将数据存入字符数组 运算符号存入字符。
整数正负判断 使用strlen()函数将两组字符串长度存入整形变量len,之后判断数据是否为负,是则长度减一并且使用一整型变量存储正负数据。
数据类型转换 倒叙将字符数组转为整型数组。
判断运算类型
输出符号判断
数据运算 加法运算直接模拟竖式计算;减法运算使被减数在两组数据最高位后一位补一,再相减(如456-789转换为1456-789=0667),如果最高位后一位为1直接输出,否则(即为0)使最高位为1其余为0减去结果(1000-0667=333)。
输出运算结果 找到第一个不为0的数开始输出,全0则输出0。
#include<stdio.h>#include<math.h>#include<string.h>#include<stdlib.h>#include<algorithm>using namespace std;char str1[1010],str2[1010];int v1[1010],v2[1010],range=1000+1; //range为计算位数+1void add(int len) //加法运算{ int i; for(i=range-1;i>=len;i--) //倒叙相加逢十进一 { v1[i]+=v2[i]; if(v1[i]>9) { v1[i]-=10; v1[i-1]++; } } if(v1[len-1]!=0)printf("%d",v1[len-1]); //判断最高位下一位是否为0 for(i=len;i<range;i++) printf("%d",v1[i]); //输出 printf("\n");}void sub(int len,int flag1) //减法运算{ int i,sign=1; //sign >0为正 =0为0 <0为负 if(v1[len]==v2[len]) //判断数据结果是否为负或0 { for(i=len+1;i<range;i++) { if(v1[i]!=v2[i]) sign=(v1[i]-v2[i])*flag1; } if(i==range)sign=0; } else sign=(v1[len]-v2[len])*flag1; if(sign<0)printf("-"); if(sign==0)printf("0"); v1[len-1]=1; //最高位前一位补1 for(i=range-1;i>=len;i--) //相减结果存入v1 { v1[i]-=v2[i]; if(v1[i]<0) { v1[i]+=10; v1[i-1]--; } } if(v1[len-1]==1) //最高位前一位未被借位 { for(i=len;i<range;i++) if(v1[i]!=0)break; for(;i<range;i++) //输出 printf("%d",v1[i]); } else //具体见思路6 { //结果存入v2 memset(v2,0,sizeof(v2)); v2[len-1]=1; for(i=range-1;i>=len;i--) { v2[i]-=v1[i]; if(v2[i]<0) { v2[i]+=10; v2[i-1]--; } } for(i=len;i<range;i++) if(v2[i]!=0)break; for(;i<range;i++) //输出 printf("%d",v2[i]); } printf("\n");}int main(){ int i,j; char sign; while(~scanf("%s %c %s",&str1,&sign,&str2)) { int len1=strlen(str1),len2=strlen(str2),flag1=1,flag2=1,j1=0,j2=0; if(str1[0]=='-') //flag存数据正负 len存长度 j存从第几位开始转换 { j1++; len1--; flag1=-1; } if(str2[0]=='-') { j2++; len2--; flag2=-1; } for(i=range-len1,j=j1;i<range;i++) v1[i]=str1[j++]-'0'; for(i=range-len2,j=j2;i<range;i++) v2[i]=str2[j++]-'0'; if(sign=='+') { if(flag1*flag2==-1) { sub(min(range-len1,range-len2),flag1); //正+负 负+正 } else { if(flag1==-1) { printf("-"); add(min(range-len1,range-len2)); //负+负 } else add(min(range-len1,range-len2)); //正+正 } } if(sign=='-') { if(flag1*flag2==1) { sub(min(range-len1,range-len2),flag1); //正-正 负-负 } if(flag1*flag2==-1) { if(flag1==1)add(min(range-len1,range-len2)); //正-负 else {printf("-");add(min(range-len1,range-len2));} //负-正 } } memset(v2,0,sizeof(v2)); //清零 memset(v1,0,sizeof(v1)); printf("\n"); } return 0;}
阅读全文
0 0
- 整数的大数加减
- 大数的加减
- 大数的加减运算
- 自定义大数类,用数组实现任意超大整数的加减乘运算
- 大数加减
- 大数加减
- 大数加减
- 大数加减
- 巨蛋疼的大数加减的类
- 整数的大数相乘
- 大数的c++实现,包括加减乘法
- 大数的加减乘阶乘,java实现
- 大数big number的加减运算
- 大整数的加减乘运算
- 大整数加减 加减运算
- 两个整数的大数相乘
- 大数想加减
- 大数运算-加减函数
- XML解析SAX与DOM
- JAVA发送邮件
- [Leetcode][python]Largest Rectangle in Histogram
- 「安卓干货铺」节后送书福利-感谢大家一直以来对我的支持!
- fastdfs-nginx-module_v1.16.tar.gz 下载
- 整数的大数加减
- 算法分析与设计week07--435. Non-overlapping Intervals
- 递归实现pow内建函数和欧几里德算法
- 171022系统虚拟机管理2
- GalaxyOJ-947 (三分)
- 进程间通讯--信号量
- Python流程控制
- 矩阵乘 [Shoi2013]超级跳马
- 【51nod】1461 稳定桌 扫描线+线段树