二师弟的星际加法
描述:
我是网络公司的一名普通程序员,英文名Steven,发音比较像“师弟”,自从入职培训自我介绍后,大家就称我为“二师弟”,我喜欢看科幻小说,也喜欢做梦,有一次梦到外星球,发现外星人使用的并非10进制/16进制等,有些星球居然使用N进制(据统计N都在2~35之间),现在我们将首先给您一个数字表示N进制,然后给出两个数字的字符串,请算出其求和结果并输出,如果输入不能正常计算则输出-1。
说明:
1:数字的字符串其中包括0-9和a-z(表示10-35)。
2:所有的输入和输出都只会是小写字母或数字,不存在其他字符。
运行时间限制: 无限制
内存限制: 无限制
输入:
整形数:计算进制
字符串:计算数1
字符串:计算数2
输出:
字符串:计算结果
样例输入:
10
100
100
样例输出:
描述:
我是网络公司的一名普通程序员,英文名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");
- }
- }
- }
- }
#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';
}
}