ZOJ1205火星加法求改

yumaozj123 2010-03-31 01:54:52
在22世纪,科学家们已经发现了在火星上居住着聪明的居民。火星人非常喜欢数学。每一年,他们都将会举行一个火星算术比赛,简称(ACM)。比赛的任务是计算两个100数位的数字的和,并且使用最少时间的便是胜利者。今年他们也邀请了地球上的人来参加比赛。作为地球的唯一代表团,你被派代表人类去火星。幸运的是,你已经带了你的手提电脑,它可以帮助你很快地完成工作。现在还仅存的问题是写一个简短的程序来计算已经给出的两个数之和。然而,你开始编程之前,你要记住的是火星人使用以20为主的数字系统,因为他们有20根手指。输入:已经给你了几组火星数字,每一个数字都在一行里。火星数字是由0到9的数字组成,并且小写字母是由a到j(小写字母从a开始是代表着10,11,…19).已经给出的数字的长度都不会大于100.输出:把每一组两个数字的和都写在单独的一行上.举例输入:
1234567890
abcdefghij
99999jjjjj
9999900001

举例输出:
bdfi02467j
iiiij00000


#include"stdio.h"
#include"string.h"
#define N 100
int sz(char m)
{
int num1;
num1=m-48;
return num1;
}
int ew(char n)
{
int num2;
num2=n-54;
return num2;
}
char bh(int q)
{
char num3;
num3=q+54;
return num3;
}
char gh(int p)
{
char num4;
num4=p+48;
return num4;
}
main()
{
int i,d,e,f;
char a[N],b[N],c[N];
while(gets(a)&&gets(b))
{
if(strlen(a)!=strlen(b))
continue;
for(i=0;i<N;i++)
{
if(a[i]>=48&&a[i]<=57)
d=sz(a[i]);
else d=ew(a[i]);
if(b[i]>=48&&b[i]<=57)
e=sz(b[i]);
else e=ew(b[i]);
f=d+e;
if(f>=10)
c[N]=bh(f);
else c[N]=gh(f);
}
printf("%s\n",c);

}
}





困擾/////
...全文
156 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
moon6623 2010-03-31
  • 打赏
  • 举报
回复
while(a[len_a])
len_a++;
while(a[len_b])
len_b++;

应该是
while(b[len_b])

试了一下二楼的,很不错,
就是可惜我的linux没有字符串倒转函数strrev
moon6623 2010-03-31
  • 打赏
  • 举报
回复

#include"stdio.h"
#include"string.h"
#define N 100

int ctoi(char c)
{
int i = 0;
if(c>='0' && c<='9')
i = c - '0';
else if(c>='a' && c<='j')
i = c - 'a' + 10;

return i;
}

char itoc(int i)
{
int c = 0;
if(i<10)
c = i + '0';
else
c = i - 10 + 'a';

return (char)c;
}

char add(char a, char b, int *full)
{
int sum = 0;
sum = ctoi(a) + ctoi(b) + *full;

if(sum >= 20)
{
*full = 1;
sum -= 20;
}
else
*full = 0;

return itoc(sum);
}

main()
{
char a[N] = {0};
char b[N] = {0};
char c[N+2] = {0};
char *p;
int i,full,len_a,len_b;
len_a = len_b = full = 0;
printf("input a:\n");
gets(a);
printf("input b:\n");
gets(b);

while(a[len_a])
len_a++;
while(a[len_b])
len_b++;

printf("len a:%d\n",len_a);
printf("len b:%d\n",len_b);

for(i=0;i<=N;i++)
{
--len_a;
--len_b;
if(len_a < 0 && len_b < 0 && full == 0)
break;

if(len_a >= 0 && len_b >= 0)
c[N-i] = add(a[len_a], b[len_b], &full);
else if(len_a >= 0)
c[N-i] = add(a[len_a], '0', &full);
else if(len_b >= 0)
c[N-i] = add('0', b[len_b], &full);
else if(full == 1)
{
c[N-i] = '1';
full = 0;
}
}
p = &c[N-i];
printf("c : %s\n",p);
}
huanmie_09 2010-03-31
  • 打赏
  • 举报
回复

#include"stdio.h"
#include"string.h"

#define N 100

int sz(char m)
{
int num1;
num1=m-48;
return num1;
}
int ew(char n)
{
int num2;
/*num2=n-54;*/
num2 = n - 87; /*a表示10,a的ascii码值为97*/
return num2;
}
char bh(int q)
{
char num3;
/*num3=q+54;*/
num3 = q + 87;
return num3;
}
char gh(int p)
{
char num4;
num4=p+48;
return num4;
}
int main()
{
int i,d,e,f;
char a[N],b[N],c[N];
int index = 0; //c的下标
int count = 0; //进位
while(gets(a)&&gets(b))
{
if(strlen(a)!=strlen(b)) {
continue;
}
for(i=strlen(a)-1;i>=0;i--)
{
if(a[i]>=48&&a[i]<=57)
d=sz(a[i]);
else
d=ew(a[i]);
if(b[i]>=48&&b[i]<=57)
e=sz(b[i]);
else
e=ew(b[i]);
f=d+e+count;
if(f>=20) {
count=1;
f=f%20;
}
else {
count=0; /*进位置0*/
}
if(f>=10)
/*c[N]=bh(f);*/
c[index++] = bh(f);
else
/*c[N]=gh(f);*/
c[index++] = gh(f);
}
if(count) { /*如果最高位还有进位*/
c[index++]=gh(count);
}
c[index]='\0'; /*置字符串结束标志*/
strrev(c); /*字符串倒转*/
printf("%s\n",c);
memset(c,'\0',index);//
count = 0; /*进位清0*/
index = 0; /*数组下标置0*/
}
}

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧