您的位置:首页 > 编程语言

华为编程大赛第二轮

2014-05-07 17:08 120 查看
二师弟的星际加法

描述:

我是网络公司的一名普通程序员,英文名Steven,发音比较像“师弟”,自从入职培训自我介绍后,大家就称我为“二师弟”,我喜欢看科幻小说,也喜欢做梦,有一次梦到外星球,发现外星人使用的并非10进制/16进制等,有些星球居然使用N进制(据统计N都在2~35之间),现在我们将首先给您一个数字表示N进制,然后给出两个数字的字符串,请算出其求和结果并输出,如果输入不能正常计算则输出-1。

 

说明:

1:数字的字符串其中包括0-9和a-z(表示10-35)。

2:所有的输入和输出都只会是小写字母或数字,不存在其他字符。

 

运行时间限制: 无限制

内存限制: 无限制

输入:

整形数:计算进制

字符串:计算数1

字符串:计算数2

输出:

字符串:计算结果

样例输入:

10

100

100

样例输出:
200

看到有用JAVA的同学的评论:Java的BigInteger跟开了作弊器一样

import java.math.BigInteger;

import java.util.InputMismatchException;

import java.util.Scanner;

public class Main {

        

        public static void main(String[] args) {

                Scanner cin = new Scanner(System.in);

                int N = cin.nextInt();

                if (N > 35 || N < 2)

                        System.out.println("-1");

                else {

                        try {

                                BigInteger a = cin.nextBigInteger(N);

                                BigInteger b = cin.nextBigInteger(N);

                                BigInteger c = a.add(b);

                                System.out.println(c.toString(N));

                        }

                        catch (InputMismatchException e) {

                                System.out.println("-1");

                        }

                }

        }

}

然后是自己的C代码,写得很水:

#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#define MAX 100
void jinzhi_ten(int n_out,char *string1,char *string2,char *output);
int caculate(int n,char *string1,char *string2,int length1,int length2,char *output);
void jinzhi_n(int n_out,int sum,char *output);
int main()
{
int N;
int length1,length2;
int flag=0;
char str1[MAX],str2[MAX];
char output[MAX];
//N=getchar();
scanf("%d",&N);
scanf("%s",str1);
scanf("%s",str2);
length1=strlen(str1);
length2=strlen(str2);

flag=caculate(N,str1,str2,length1,length2,output);
if(flag==0)
printf("-1");
else
printf("%s",output);

return 0;

}

int caculate(int n,char *string1,char *string2,int length1,int length2,char *output)
{
int out,n_out;
int i;
if(n>1&&n<=9)
{
n_out=n;
jinzhi_ten(n_out,string1,string2,output);
out=1;

}
else if(n>9&&n<35)
{
n_out=n;
jinzhi_ten(n_out,string1,string2,output);
out=1;
}

else
out=0;

for(i=0;i<length1;i++)//输入字符串1不符合规定,输出-1
{
if((string1[i]>='0'&&string1[i]<='9')||(string1[i]>='a'&&string1[i]<='z'))
{
//out=out;
if(string1[i]>='0'&&string1[i]<='9')
{
if(string1[i]-'0'>=n)//输入字符大于了进制数(如2进制输入了3)

{
out=0;
break;
}
}
else if(string1[i]>='a'&&string1[i]<='z')
{
if(string1[i]-'a'+10>=n)////输入字符大于了进制数(如10进制输入了b)
{
out=0;
break;
}
}
}

else
{
out=0;
break;
}

}
for(i=0;i<length2;i++)//输入字符串2不符合规定,输出-1
{
if((string2[i]>='0'&&string2[i]<='9')||(string2[i]>='a'&&string2[i]<='z'))
{
//out=out;
if(string2[i]>='0'&&string2[i]<='9')
{
if(string2[i]-'0'>=n)//输入字符大于了进制数(如2进制输入了3)
{
out=0;
break;
}
}
else if(string2[i]>='a'&&string2[i]<='z')
{
if(string2[i]-'a'+10>=n)  ////输入字符大于了进制数(如10进制输入了b)
{
out=0;
break;
}
}
}
else
out=0;

}

return out;
}

void jinzhi_ten(int n_out,char *string1,char *string2,char *output)//N进制变成10进制
{
int i,j;
int sum,sum1=0,sum2=0;
int length1,length2;
int b=1;
length1=strlen(string1);
length2=strlen(string2);
if(n_out<10)
{
for(i=length1-1;i>=0;i--)
{
sum1 += (string1[i]-'0') *b;
b *= n_out;
}
b=1;
for(i=length2-1;i>=0;i--)
{
sum2 += (string2[i]-'0') *b;
b *= n_out;
}
}
else
{
for(i=length1-1;i>=0;i--)
{
if(string1[i]>='0'&&string1[i]<='9')
sum1 += (string1[i]-'0') *b;
else
sum1 += (string1[i]-'a'+10) *b;

b *= n_out;
}
b=1;
for(i=length2-1;i>=0;i--)
{
if(string2[i]>='0'&&string2[i]<='9')
sum2 += (string2[i]-'0') *b;
else
sum2 += (string2[i]-'a'+10) *b;
b *= n_out;
}

}
sum=sum1+sum2;//十进制的和
jinzhi_n(n_out,sum,output);//10进制抓化为n进制

}

void jinzhi_n(int n_out,int sum,char *output)//10进制变为N进制
{
int i=0,j=0,k=0;
int tmp[MAX];
if(n_out<10)
{
do{
tmp[i]=sum%n_out;
sum=sum/n_out;
i++;
}while(sum!=0);
k=0;
for(j=i-1;j>=0;j--)
{
output[k]=tmp[j]+'0';
k++;
}
output[k]='\0';
}
else
{
do{
tmp[i]=sum%n_out;
sum=sum/n_out;
i++;
}while(sum!=0);
k=0;
for(j=i-1;j>=0;j--)
{
if(tmp[j]>=10)
output[k]=tmp[j]+'a'-10;
else
output[k]=tmp[j]+'0';
k++;
}
output[k]='\0';

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  华为 创新杯 编程