题解 P6467 【[COCI2008-2009#6] BUKA】
ShineEternal
2020-04-25 07:30:35
作为翻译者想来提供一篇题解和 std。
---
## solution
这应该是一个简化版的高精度。
由于数据是 $10$ 的幂次,所以就只需要考虑位数的问题。分 `+` `*` 两种情况讨论:
- `+`:可以发现,答案中最多只有两个 $1$ 或者一个 $2$。,我们就把两个数字的最高位打上标记就行(别忘了 $2$ 要累加)。然后其他位都是 $0$。
- `*`:只需要第一位输出 $1$,再把两个数字中的 $0$ 都在后面输出即可。
## code
#### 本人代码:
```cpp
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[105];
char s1[150],s2[150],tmp[5];
int main()
{
scanf("%s",s1);
scanf("%s",tmp);
scanf("%s",s2);
int n=strlen(s1);
int m=strlen(s2);
if(tmp[0]=='+')
{
a[n]=1;
a[m]=1;
if(n==m)
{
printf("2");
for(int i=2;i<=n;i++)printf("0");
return 0;
}
for(int i=max(n,m);i>=1;i--)
{
printf("%d",a[i]);
}
}
if(tmp[0]=='*')
{
printf("1");
for(int i=1;i<=n-1+m-1;i++)printf("0");
}
return 0;
}
```
#### 官方 std:
```cpp
#include <cstring>
#include <cstdio>
#define maxn 101
char a[maxn], op[2], b[maxn];
int la, lb;
int veci( int a, int b ) { return a>b? a: b; }
int manji( int a, int b ) { return a<b? a: b; }
void nule( int n ) {
for( int i = 0; i < n; ++i ) printf( "0" );
}
int main(void) {
scanf( "%s%s%s", a, op, b );
la = strlen( a );
lb = strlen( b );
if( op[0] == '+' ) { // zbrajanje
// poseban slucaj ako su isti brojevi, rezultat je 2 puta odgovarajuca potencija broja 10
if( la == lb ) { printf( "2" ); nule( la-1 ); }
else {
printf( "1" ); nule( veci( la, lb ) - manji( la, lb ) - 1 ); // ako nisu isti rezultat je oblika 1, neke nule, 1, neke nule
printf( "1" ); nule( manji( la, lb ) - 1 );
}
} else { // mnozenje
printf( "1" );
nule( la+lb-2 );
}
printf( "\n" );
return 0;
}
```