题解 P6467 【[COCI2008-2009#6] BUKA】

ShineEternal

2020-04-25 07:30:35

Solution

作为翻译者想来提供一篇题解和 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; } ```