1 问题描述
高老师的学术科研开展的如火如荼,但最近有件事让他很烦恼,在做学术研究过程中,经常需要对很大很大的数据进行计算,而现有的计算器没办法满足这种计算需求,所以现在想请大家帮忙实现一个计算器PLUS版。
为了减少大家的工作量,高老师已经将函数的输入输出接口定义完成,你只需编写计算器PLUS的核心部分。
例如 plus() , minus() 和 multiply() 函数,有三个char * 类型的参数 a、b 和 c,a 和 b 分别是参与运算的两个整数,c 用来存放运算结果。所有数字以字符串的形式保存。你的计算结果(在 c 中保存)中不应包含任何前导零。
* 注意,你只需提交编写的三个函数即可。
所有的测试点中的整数,包括结果整数的十进制位数均不超过 1000,均保证其包含的所有整数非负。但不保证结果非负。
输入的数字可能存在前导0
预设代码 前置代码
#include <stdio.h>
#include <string.h>
void plus(const char * a, const char * b, char * c);
void minus(const char * a, const char * b, char * c);
void multiply(const char * a, const char * b, char * c);
int main()
{
static char a[100005];
static char b[100005];
static char c[200005];
static char s[2];
while (scanf("%s %s %s", a, s, b) == 3) {
if (s[0] == '+') {
plus(a, b, c);
} else if (s[0] == '-') {
minus(a, b, c);
} else if (s[0] == '*') {
multiply(a, b, c);
}
printf("%sn", c);
}
return 0;
}
| 测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
|---|---|---|---|---|---|
| 测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
-
刚开始没有意识到这个题的考点,还以为是要复习一下C语言的知识点,字符串和整型数字的转换,于是我开始了
-
代码就不放了,总之就是算是偷懒的做法
代码主要是在提取,提取出来以后直接相乘得到结果,然后再把结果存进去
-
不过也借这个机会复习了一下怎么转换字符串和int整型这两种类型了,整理了一下,记录在这了
https://blog.csdn.net/qq_41680771/article/details/121058779
<2> 最终AC版
-
其实算法很简单(没有算法好像),主要就是不断调试来修改代码符合题意
-
题目中说位数不超过1000,我们平时说的一亿才11位,所以提取出来进行运算的操作肯定是不行的了
-
输入可能会有前缀0,注意进行处理避免没必要的运算,另外输出是不需要前缀的
-
加法:每一位取出来相加,对应的结果报存在整型数组tmp[]里面,注意是从后往前存的,然后遍历一遍,根据10进制特点和规律进行调整,相加的话可能会使得位数增加
-
减法:结果的正负处理方式不一样,分开处理,最后的结果如果是负数的话,需要在c里面加上“-”号
-
乘法:我是对于b的每一位,用a的每一位去乘它,对应结果保存在tmp的相应位置
-
好吧,其实就是竖式运算~~~
得到的结果累加,最后再处理
-
代码
#include#include void plus(const char * a, const char * b, char * c); void minus(const char * a, const char * b, char * c); void multiply(const char * a, const char * b, char * c); int main() { static char a[100005]; static char b[100005]; static char c[200005]; static char s[2]; //freopen("file out.txt","r",stdin); while (scanf("%s %s %s", a, s, b) == 3) { if (s[0] == '+') { plus(a, b, c); } else if (s[0] == '-') { minus(a, b, c); } else if (s[0] == '*') { multiply(a, b, c); } printf("%sn", c); } return 0; } void plus(const char * a, const char * b, char * c){ int lena,lenb,lentmp; int notzeroA,notzeroB; int tmp[20005]; int i=0; int flag=0; lena = strlen(a); lenb=strlen(b); while(a[i]=='0') //处理前缀0 i++; notzeroA=i; //第一个不是0的位置 i=0; while(b[i]=='0') i++; notzeroB=i; // for(i=0;(lena--)>0||(lenb--)>0;i++){ //这个会导致后面一个语句不运行,||类型,前面已经是真的了 for(i=0;lena>notzeroA||lenb>notzeroB;i++){ lena--; lenb--; if(lena 9){ flag=1; //需要进1的标志 tmp[i]%=10; } } if(flag) //总和大于当前位数,需要增加 tmp[lentmp++]=1; while(tmp[lentmp-1]==0) lentmp--; for(i=0;i


