今天晚上看到群里面交流的信息,发现又出新题了,看了一下,难度还可以,是一般性的题目。事实如此,大家一说简单,一会儿就由三星难度降为二星了...题目不少,有兴趣的朋友们可以去英雄会......
如题:
在二十进制中,我们除了使用数字0-9以外,还使用字母a-j(表示10-19),给定两个二十进制整数,求它们的和。 输入是两个二十进制整数,且都大于0,不超过100位;
输出是它们的和(二十进制),且不包含首0。我们用字符串来表示二十进制整数。
总的来说,这一题难度还可以,只要注意点没忘记,大家应该都是没问题的;
首先是简单的两个数相加“122” + “221”,当然就是“343”,只要进行正常加减即可;
接下来是“1aa” + "222",结果是“3cc”;
以上这两个实例只要将数所对应的数相加即可;
接下来考虑进位问题:
“1aa” + "22a",结果是“3d0”;
这时我们需要考虑进位问题,并将进位标记传到前一个;
最后是考虑两个数位数不同的数字,这时我们将两个较短的一个数首先加完,最后将长的数前面补上即可,但是这时我们得考虑之前加完的进位问题。
如对"jaa"+"aa",a+a=20,进位1;a+a+1=21;再次进位1;j+1=20;再次进位1;结果为"1010";
总体来说,这一题不是什么算法的问题,我们将逻辑弄清楚即可;
想必这些对大家都是“so easy”...贴上代码,未做过多优化,但是思路清晰:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char start[21] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};
char* calculate (char* x,char* y)
{
int length, lengthA, lengthB;
int i, index = 0;
int poor;
int temp;
char* num = (char *)malloc (102);
for(i = 0; i < 102; i++)
num[i] = '\0';
lengthA = strlen(x); //数x的长度
lengthB = strlen(y); //
length = lengthA;
if(length > lengthB) //找到较短的数,对其进行相加
length = lengthB;
for(i = 0; i < length; i++)
{
poor = x[lengthA - i - 1] + y[lengthB - i - 1] - '0' - '0'; //将两个数进行相加
while(poor > 40) //被加数出现>='a'的,-39即是加上10
poor -= 39; //a的ascii是97,0的ascii是48
if(poor >= 20) //>20,进位
{
poor -= 20;
num[i] = start[poor + index];
index = 1; //标记进位
}
else
{
if(poor + index >= 20) //借助上一次的index成功进位,如对"ja"和"a"
{
poor -= 19;
num[i] = start[poor];
index = 1;
}
else //进行普通相加
{
num[i] = start[poor + index];
index = 0;
}
}
}
for(i = length; i < lengthA; i++) //若x的长度长于y
{
poor = x[lengthA - i - 1] - '0';
if(poor > 40)
poor -= 39;
if(poor + index >= 20)
{
poor -= 19;
num[i] = start[poor];
index = 1;
}
else
{
num[i] = start[poor + index];
index = 0;
}
}
if(index == 1 && lengthA > lengthB)
{
num[i] = start[1];
index = 0;
}
for(i = length; i < lengthB; i++) //若y的长度长于x
{
poor = y[lengthB - i - 1] - '0';
if(poor > 40)
poor -= 39;
if(poor + index >= 20)
{
poor -= 19;
num[i] = start[poor];
index = 1;
}
else
{
num[i] = start[poor + index];
index = 0;
}
}
if(index == 1)
{
num[i] = start[1];
}
index = strlen(num); //此时index是num的长度,进行反转
for(i = 0; i < index / 2; i++)
{
temp = num[i];
num[i] = num[index - i - 1];
num[index - i - 1] = temp;
}
return num;
}
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int main()
{
printf("%s",calculate("jaa","aa"));
return 0;
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。
修订:在进行后length位相加部分的代码可进行如下优化;
for(i = 0; i < length; i++)
{
poor = x[lengthA - i - 1] + y[lengthB - i - 1] - '0' - '0'; //将两个数进行相加
while(poor > 40) //被加数出现>='a'的,-39即是加上10
poor -= 39; //a的ascii是97,0的ascii是48
if(poor + index >= 20) //>20,进位
{
poor = poor + index - 20;
num[i] = start[poor];
index = 1; //标记进位
}
else
{
num[i] = start[poor + index];
index = 0;
}
}
不足之处,还请大家指点...
o(∩_∩)o
分享到:
相关推荐
无符号十进制数加法实验 ,与需要看的人赶紧下载,绝对宝贵
用汇编实现十进制加法运算,从键盘输入两个一位十进制数相加并输出结果。
2位2进制同步加法计数器 数字逻辑实验 2位2进制同步加法计数器 数字逻辑实验
在以上十进制数加法要求的基础上,将加法算式及和在显示器上显示。 如ADDOP1中存放1234H,在ADDOP2中存放6789H,执行程序后显示器上显示: 1234+6789=8023
EDA课程设计,设计了一个十进制加法器,内容包括加法器的原理,电路原理图以及仿真结果图
vhdl实验二(异步触发十进制加法计数器),有源程序,仿真图,eda2000连接图。
课程设计,八进制同步加法计数器八进制同步加法计数器八进制同步加法计数器八进制同步加法计数器
初学者,文件过程:先设计一位的加法计数,再一个个进位达成八位二进制加法,若要改成十进制的只需要修改加法部分语言将二进制改成十进制即可
带进位的十进制加法器,VHDL语言编写,可直接应用,可进行仿真。
本电路实现了同步三十二进制加法计数器的功能: 电路能准确地按照三十二进制加法计数的规律进行计数. 读者应深刻理解本例的分析和设计过程, 以为日后设计更为复杂的同步时序逻辑电路打下基础.
二十进制的加法、乘法表,使用xlsx表格的方式保存,方便查看,有需要可以下载
电子技术实验报告-四位二进制数的可控加法减法.docx 电子技术实验报告-四位二进制数的可控加法减法.docx 电子技术实验报告-四位二进制数的可控加法减法.docx 电子技术实验报告-四位二进制数的可控加法减法.docx 电子...
(2)设计试验步骤 (3)使用开关进行数据加载,完成补码加、减运算 (4)符号位运算采用双符号位,累加器应有清零控制 (5)通过指示灯观察运算结果,记录实验现象
一位十进制加减法器--数字逻辑设计及应用课程设计报告 1.0-9十个字符和“+”“-”分别对应一个按键,用于数据输入。 2.用一个开关控制加减法器的开关状态。 3.要求在数码显示管上显示结果。
将两个多位十进制数相加,要求加数和被加数均以ASCII码形式各自顺序存放以DATA1和DATA2为首的5个内存单元中(低位在前),结果送回DATA1处。
led指示的二进制数加法显示.doc
本电路实现了同步十进制加法计数器的功能: 电路能准确地按照十进制加法计数的规律进行计数. 读者应深刻理解本例的分析和设计过程, 以为日后设计更为复杂的同步时序逻辑电路打下基础.
该程序为汇编语言编写,功能是将两个多位十进制数(如四位)相加,要求被加数、加数以ASCII码形式按顺序存放在以DATA1和DATA2为首的5个内存单元中(低位在前)。将相加结果仍以常用十进制数形式显示在屏幕上。
74ls74d触发器构成4位二进制异步加法计数器.ewb
更多精彩:...多多交流.... //start 提示:自动阅卷起始唯一标识,请勿删除或增加。 int main() { printf("%s",calculate("jaa","aa")); return 0; ...//end //提示:自动阅卷结束唯一标识,请勿删除或增加。