• Carryless Square Root


    Carryless Square Root

    题目大意:乘法加法运算时不进位(进位舍去),给出一个数,这个数是一个数的平方运算而来的,求这个数。

    AC_Code

     1 #include <bits/stdc++.h>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cmath>
     5 #include <ctime>
     6 #include <string>
     7 using namespace std;
     8 
     9 typedef long long ll;
    10 const int maxn = 35;
    11 int a[maxn], ans[maxn], d[maxn];
    12 int n;
    13 char s[maxn];
    14 
    15 void dfs(int now_digit){
    16     if( now_digit==n ){
    17         memset(d,0,sizeof(d));
    18         for(int j=0; j<now_digit; j++){
    19             for(int k=0; k<now_digit; k++){
    20                 d[j+k]+=(ans[j]*ans[k]);
    21                 d[j+k]%=10;
    22             }
    23         }
    24 
    25         for(int i=0;i<2*now_digit-1;i++){
    26             if( d[i]!=a[i] ) return ;
    27         }
    28 
    29         for(int i=0;i<n;i++){
    30             if( i==n-1 ) printf("%d
    ",ans[n-1]);
    31             else printf("%d",ans[i]);
    32         }
    33         exit(0);
    34     }
    35 
    36     else{
    37         for(int i=0; i<=9; i++){///注意为什么从0开始记位,而不从1开始记位,
    38             ///因为从一开始(1+1)==2,算出来没有第1位了
    39             ans[now_digit] = i;
    40             memset(d,0,sizeof(d));
    41             for(int j=0; j<=now_digit; j++){
    42                 for(int k=0; k<=now_digit; k++){
    43                     if( j+k>now_digit ) break;
    44                     d[j+k]+=(ans[j]*ans[k]);
    45                     d[j+k]%=10;
    46                 }
    47             }
    48 
    49             int flag=0;
    50             for(int ii=0;ii<=now_digit;ii++){
    51                 if( d[ii]!=a[ii] ) flag=1;
    52             }
    53             if( !flag ){///比较快,如果原来是flag==1,判flag==1,用了31ms,判!flag用了15ms
    54                 dfs(now_digit+1);
    55             }
    56         }
    57     }
    58 }
    59 
    60 int main()
    61 {
    62     scanf("%s",s);
    63     int len = strlen(s);
    64 
    65     for(int i=0;i<len;i++) a[i]=s[i]-'0';
    66     if( a[len-1]=='2' || a[len-1]=='3' || a[len-1]=='7' || a[len-1]=='8' ) printf("-1
    ");///平方数的结果都不可能出现2,3,7,8
    67     else if( a[0]=='2' || a[0]=='3' || a[0]=='7' || a[0]=='8' ) printf("-1
    ");
    68     else if( !len&1 ) printf("-1
    ");///由于不进位,所以任何数的平方数的位数都为奇数
    69     else{
    70         n=(len+1)/2;
    71         dfs(0);
    72         printf("-1
    ");
    73     }
    74     return 0;
    75 }
  • 相关阅读:
    angular的uiRouter服务学习(2)
    angular的uiRouter服务学习(1)
    angular学习笔记(三十一)-$location(2)
    angular指令中使用ngModelController
    angular中的表单数据自定义验证
    angular-ngSanitize模块-linky过滤器详解
    angular-1.3 之ng-model-options指令
    angular控制器的执行顺序和服务的注入情况
    angular五种服务详解
    .NET CORE EF 框架调用存储过程
  • 原文地址:https://www.cnblogs.com/wsy107316/p/12242169.html
Copyright © 2020-2023  润新知