华为编程大赛第二轮

二师弟的星际加法
描述:


我是网络公司的一名普通程序员,英文名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跟开了作弊器一样

  1. import java.math.BigInteger;
  2. import java.util.InputMismatchException;
  3. import java.util.Scanner;

  4. public class Main {
  5.         
  6.         public static void main(String[] args) {
  7.                 Scanner cin = new Scanner(System.in);
  8.                 int N = cin.nextInt();
  9.                 if (N > 35 || N < 2)
  10.                         System.out.println("-1");
  11.                 else {
  12.                         try {
  13.                                 BigInteger a = cin.nextBigInteger(N);
  14.                                 BigInteger b = cin.nextBigInteger(N);
  15.                                 BigInteger c = a.add(b);
  16.                                 System.out.println(c.toString(N));
  17.                         }
  18.                         catch (InputMismatchException e) {
  19.                                 System.out.println("-1");
  20.                         }
  21.                 }
  22.         }
  23. }
然后是自己的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';
	


	}


	
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值