模拟题
注意要点:
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));
}
}
}