POJ 1489

模拟题

注意要点:

1. 和快速幂类似,但是是加法。

2. 输入最后两行是\n;

3. 转string最后不要输出空格。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>

using std::memset;
using std::map;
using std::cin;

long long a,b;
char stra[100], strb[100];
map<char,int> symbol;
char hash[10];


long long parseInt(char str[100], int len)
{
	long long ans = 0 ;
	for(int i = 0 ; i < len; i++)
	{
		if(str[i] != ' ')
		ans += symbol[str[i]];
	}
	return ans;
}

void parseString(long long a,char *str)
{
	int cnt = 0;
	int nbit = 0;
	while(a)
	{
		for(int i = 0 ; i < a%10; i++)
			str[cnt++] = hash[nbit];
		if(a%10 && a/10) str[cnt++] = ' ';
		a /= 10;
		nbit++;
	}
	str[cnt++] = '\0';
}

void cal(char stra[100], int lena, char strb[100],int lenb)
{
	long long a = parseInt(stra, lena);
	long long b = parseInt(strb, lenb);

	char mida[100], midb[100];
	long long m = 0;
	long long bit = 0;

	while(b)
	{
		parseString(1<<bit, mida);
		parseString(a, midb);

		long long lena1 = strlen(mida);
		long long lenb1 = strlen(midb);

		if(b&1)
		{
			m += a;
			printf("%s", mida);
			printf(" *");
			for(int i = 0 ; i < 32 -lena1; i++)
				printf(" ");
			printf("%s\n", midb);
		}
		else
		{
			printf("%s", mida);
			for(int i = 0 ; i < 34 -lena1; i++)
				printf(" ");
			printf("%s\n", midb);
		}
		a = a<<1;
		b = b>>1;
		bit ++;
	}

	char ans[100];
	parseString(m, ans);
	printf("The solution is: ");
	printf("%s\n", ans);
}

void init()
{
	symbol['|'] = 1;
	symbol['n'] = 10;
	symbol['9'] = 100;
	symbol['8'] = 1000;
	symbol['r'] = 10000;

	hash[0] = '|';
	hash[1] = 'n';
	hash[2] = '9';
	hash[3] = '8';
	hash[4] = 'r';
}

int main()
{
	char stra[100], strb[100];
	init();
	while(cin.getline(stra, 100))
	{
		cin.getline(strb, 100);
		if(strlen(stra) && strlen(strb))
		{
			cal(stra, strlen(stra), strb, strlen(strb));
		}
	}
}



 

posted @ 2013-07-09 11:33  little_hsu  阅读(209)  评论(0编辑  收藏  举报