3060293_ac_0ms_156k.cpp

来自「北大大牛代码 1240道题的原代码 超级权威」· C++ 代码 · 共 175 行

CPP
175
字号
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char nn[257][10];

void solve(char num[])
{
	int i;

	for(i = strlen(num)-1; i >= 0; i--)
	{
		if(num[i]>' ')
		{
			num[i+1] = '\0';
			break;
		}
	}
	for(i = 0; num[i]; i++)
	{
		if(num[i]>' ')
		{
			strcpy(num,&num[i]);
			return ;
		}
	}
}

void add(char a[],char b[])
{
	int i, l, w, t;
	int l1, l2;

	l1 = strlen(a);
	l2 = strlen(b);
	l = l1>l2?l1:l2;
	w = 0;
	for(i = 0; i < l; i++)
	{
		if(i>=l1)
			a[i] = '0';
		if(i>=l2)
			b[i] = '0';
		t = a[i]+b[i]-'0'-'0'+w;
		if(t>=10)
			t%=10,w=1;
		else
			w = 0;
		a[i] = t + '0';
	}
	if(w)
		a[i++] = '1';
	a[i] = '\0';
}


void reverse(char str[])
{
	int i, l;
	char ch;

	l = strlen(str);
	for(i = 0; i < l/2; i++)
	{
		ch = str[i];
		str[i] = str[l-1-i];
		str[l-1-i] = ch;
	}
}

void multi(char a[],char b[])
{
	int i, p, w, j;
	int l1, l2, tmp;
	char ans[100];

	if(strcmp(a,"0")==0||strcmp(b,"0")==0)
		return ;
	l1 = strlen(a);
	l2 = strlen(b);
	p = 1;
	for(i = 0; i < 100; i++)
		ans[i] = '0';
	for(i = 0; i < l2; i++)
	{
		w = 0;
		for(j = 0; j < l1; j++)
		{
			tmp = (a[j]-'0')*(b[i]-'0')+w;
			tmp += ans[j+i]-'0';
			ans[j+i] = tmp%10+'0';
			w = tmp/10;
		}
		if(w)
			ans[j+i] = '0'+w;
	}
	if(w)
		p = 0;
	ans[j+i-p] = '\0';
	strcpy(a,ans);
}

void calc(char ret[],char num[],int base)
{
	char b[300];
	int i;
	char tmp[300];

	itoa(base,b,10);
	reverse(b);
	strcpy(ret,"0");
	for(i = 0; num[i]; i++)
	{
		multi(ret,b);
		strcpy(tmp,nn[num[i]]);
		add(ret,tmp);
	}
}

int main()
{
	int i;
	char ans[300];
	char base[300], num[300];

	if(scanf("%s",base)!=1)
		return 0;
	solve(base);
	for(i = 0; base[i]; i++)
	{
		itoa(i,nn[base[i]],10);
		reverse(nn[base[i]]);
	}
	getchar();
	while(1)
	{
		while(gets(num))
		{
			if(strlen(num)==0)
				break;
			solve(num);
			strcpy(ans,"0");
			for(i = strlen(base)-1; i > 0; i--)
			{
				char tmp[300];
				calc(tmp,num,i+1);
				add(ans,tmp);
				if(strchr(num,base[i]))
				{
					break;
				}
			}
			reverse(ans);
			puts(ans);
		}
		printf("\n");
		while(1)
		{
			if(gets(num)==NULL)
				return 0;
			if(strlen(num)!=0)
			{
				strcpy(base,num);
				solve(base);
				for(i = 0; base[i]; i++)
				{
					itoa(i,nn[base[i]],10);
					reverse(nn[base[i]]);
				}
				break;
			}
		}
	}
	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?