面试题题解

A、大还是小?

思路:不能当做浮点数输入,要当做字符串输入,然后比较小数点的位置,再比较小数点前的大小,再比较小数部分的大小。

  1 #include<stdio.h>
  2 #include<iostream>
  3 #include<string.h>
  4 #include<math.h>
  5 #include<algorithm>
  6 #include<vector>
  7 #include<string>
  8 #include<queue>
  9 #include<map>
 10 #include<stack>
 11 #include<set>
 12 #define ll long long
 13 #define maxn 100010
 14 #define PI acos(-1.0)    //圆周率
 15 const ll INF = 1e18;
 16 using namespace std;
 17 char s1[110],s2[110];
 18 int cas;
 19 int main()
 20 {
 21     cas=0;
 22     while(scanf("%s %s",s1,s2)!=EOF)
 23     {
 24         int len1=strlen(s1);
 25         int len2=strlen(s2);
 26 
 27         int dex1=0;
 28         int dex2=0;
 29 
 30         for(int i=0;i<len1;i++)
 31         {
 32             if(s1[i]=='.')
 33             {
 34                 dex1=i;
 35                 break;
 36             }
 37         }
 38         for(int i=0;i<len2;i++)
 39         {
 40             if(s2[i]=='.')
 41             {
 42                 dex2=i;
 43                 break;
 44             }
 45         }
 46 
 47         if(dex1!=dex2)
 48         {
 49             if(dex1<dex2)  printf("Case %d: Smaller
",++cas);
 50             if(dex1>dex2)  printf("Case %d: Bigger
",++cas);
 51             continue;
 52         }
 53 
 54         int len=len1<len2?len1:len2;
 55         int flag=-1;
 56         for(int i=0;i<len;i++)
 57         {
 58             if(s1[i]>s2[i])
 59             {
 60                 flag=1;
 61                 break;
 62             }
 63             else if(s1[i]<s2[i])
 64             {
 65                 flag=2;
 66                 break;
 67             }
 68         }
 69 
 70         if(flag==1)  printf("Case %d: Bigger
",++cas);
 71         else if(flag==2)  printf("Case %d: Smaller
",++cas);
 72         else
 73         {
 74             if(len1>len2)
 75             {
 76                 for(int i=len;i<len1;i++)
 77                 {
 78                     if(s1[i]!='0')
 79                     {
 80                         flag=1;
 81                         break;
 82                     }
 83                 }
 84             }
 85             else if(len1<len2)
 86             {
 87                 for(int i=len;i<len2;i++)
 88                 {
 89                     if(s2[i]!='0')
 90                     {
 91                         flag=2;
 92                         break;
 93                     }
 94                 }
 95             }
 96             else
 97             {
 98                 for(int i=len;i<len2;i++)
 99                 {
100                     if(s2[i]!='0')  flag=2;
101                     else if(s1[i]!='0')  flag=1;
102 
103                     if(flag!=-1)  break;
104                 }
105             }
106 
107             if(flag==1)  printf("Case %d: Bigger
",++cas);
108             else if(flag==2)  printf("Case %d: Smaller
",++cas);
109             else  printf("Case %d: Same
",++cas);
110         }
111     }
112 
113     return 0;
114 }
View Code

B、错误的算法

思路:先用错误的算法算出答案,再用正确的算法算出答案,再比较,不同的就是强数据,相同的就是弱数据,正确的算法是算出每一种可能再选出最大的那个。

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<string.h>
 4 #include<math.h>
 5 #include<algorithm>
 6 #include<vector>
 7 #include<string>
 8 #include<queue>
 9 #include<map>
10 #include<stack>
11 #include<set>
12 #define ll long long
13 #define maxn 100010
14 #define PI acos(-1.0)    //圆周率
15 const int INF = 500000;
16 using namespace std;
17 int maze[510][510];
18 int c[510];
19 int r[510];
20 int n,m;
21 int cas;
22 int main()
23 {
24     cas=1;
25     while(scanf("%d %d",&n,&m)!=EOF)
26     {
27         memset(maze,0,sizeof(maze));
28         for(int i=0;i<n;i++)
29         {
30             for(int j=0;j<m;j++)  scanf("%d",&maze[i][j]);
31         }
32 
33         int k=0;
34         int bigr=0;
35         int bigc=0;
36         for(int i=0;i<n;i++)
37         {
38             k=0;
39             for(int j=0;j<m;j++)  k+=maze[i][j];
40             r[i]=k;
41             bigr=bigr>k?bigr:k;
42         }
43         for(int i=0;i<m;i++)
44         {
45             k=0;
46             for(int j=0;j<n;j++)  k+=maze[j][i];
47             c[i]=k;
48             bigc=bigc>k?bigc:k;
49         }
50 
51         int ans=0;
52         for(int i=0;i<n;i++)
53         {
54             for(int j=0;j<m;j++)
55             {
56                 k=r[i]+c[j]-maze[i][j];
57                 ans=ans>k?ans:k;
58             }
59         }
60 
61         int f=0;
62         for(int i=0;i<n;i++)
63         {
64             for(int j=0;j<m;j++)
65             {
66                 if(r[i]==bigr&&c[j]==bigc)
67                 {
68                     k=r[i]+c[j]-maze[i][j];
69                     if(k!=ans)  f=1;
70                     else  f=2;
71                     break;
72                 }
73             }
74             if(f)  break;
75         }
76 
77         if(f==1)  printf("Case %d: Strong
",cas++);
78         else  printf("Case %d: Weak
",cas++);
79     }
80 
81     return 0;
82 }
View Code

C、又一道简单题

思路:直接把四个数的可能性都枚举一次就行了

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<string.h>
 4 #include<math.h>
 5 #include<algorithm>
 6 #include<vector>
 7 #include<string>
 8 #include<queue>
 9 #include<map>
10 #include<stack>
11 #include<set>
12 #define ll long long
13 #define maxn 10010
14 #define PI acos(-1.0)    //圆周率
15 const ll INF = 1e18;
16 using namespace std;
17 int vis[maxn];
18 int T,n;
19 int main()
20 {
21     while(scanf("%d",&T)!=EOF)
22     {
23         int cas=1;
24         for(int i=1;i<=100;i++)  vis[i*i]=1;
25         while(T--)
26         {
27             scanf("%d",&n);
28             int a=n/1000;
29             int b=n/100%10;
30             int c=n/10%10;
31             int d=n%10;
32 
33             int ans=0;
34 
35             for(int i=1;i<=9;i++)
36             {
37                 if(i!=a)
38                 {
39                     int k=i*1000+b*100+c*10+d;
40                     if(vis[k])  ans++;
41                 }
42             }
43 
44             for(int i=0;i<=9;i++)
45             {
46                 if(i!=b)
47                 {
48                     int k=a*1000+i*100+c*10+d;
49                     if(vis[k])  ans++;
50                 }
51             }
52 
53             for(int i=0;i<=9;i++)
54             {
55                 if(i!=c)
56                 {
57                     int k=a*1000+b*100+i*10+d;
58                     if(vis[k])  ans++;
59                 }
60             }
61 
62             for(int i=0;i<=9;i++)
63             {
64                 if(i!=d)
65                 {
66                     int k=a*1000+b*100+c*10+i;
67                     if(vis[k])  ans++;
68                 }
69             }
70 
71             printf("Case %d: %d
",cas++,ans);
72         }
73     }
74 
75     return 0;
76 }
View Code

D、就多了两分钟

思路:把时长用分钟表示出来,如果不是30的倍数,少的那部分就是还要上机的时间,然后凑到30的倍数之后除以30就是费用了

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<string.h>
 4 #include<math.h>
 5 #include<algorithm>
 6 #include<vector>
 7 #include<string>
 8 #include<queue>
 9 #include<map>
10 #include<stack>
11 #include<set>
12 #define ll long long
13 #define maxn 100010
14 #define PI acos(-1.0)    //圆周率
15 const ll INF = 1e18;
16 using namespace std;
17 int h1,h2,m1,m2;
18 int cas;
19 int main()
20 {
21     cas=1;
22     while(scanf("%d %d %d %d",&h1,&m1,&h2,&m2)!=EOF)
23     {
24         if(h1>h2||(h1==h2&&m1>m2))
25         {
26             printf("Day %d: Joking
",cas++);
27             continue;
28         }
29 
30         if(m1>m2)
31         {
32             m2+=60;
33             h2-=1;
34         }
35 
36         int ti=(h2-h1)*60+m2-m1;
37 
38         int mon=0;
39         int ans=0;
40         if(ti%30==0)
41         {
42             mon=ti/30;
43             ans=0;
44         }
45         else
46         {
47             mon=ti/30+1;
48             ans=mon*30-ti;
49         }
50 
51         printf("Day %d: %d %d
",cas++,mon,ans);
52     }
53 
54     return 0;
55 }
View Code

E、N!

思路:大数乘阶模板

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<string.h>
 4 #include<math.h>
 5 #include<algorithm>
 6 #include<vector>
 7 #include<string>
 8 #include<queue>
 9 #include<map>
10 #include<stack>
11 #include<set>
12 #define ll long long
13 #define maxn 100010
14 #define PI acos(-1.0)    //圆周率
15 const ll INF = 1e18;
16 using namespace std;
17 int f[maxn];
18 int main()
19 {
20     int i,j,n;
21     while(scanf("%d",&n)!=EOF)
22     {
23         memset(f,0,sizeof(f));
24 
25         f[0]=1;
26         int count=1;
27         for(i=1; i<=n; i++)
28         {
29             int c=0;//进位
30             for(j=0; j<count; j++)//阶乘位数
31             {
32                 int s=f[j]*i+c;
33                 f[j]=s%10;
34                 c=s/10;
35             }
36 
37             while(c)
38             {
39                 f[count++]=c%10;
40                 c/=10;
41             }
42         }
43 
44         for(j=maxn-1; j>=0; j--)
45             if(f[j]) break;
46 
47         for(i=j; i>=0; i--)
48             printf("%d",f[i]);
49 
50         printf("
");
51     }
52     return 0;
53 }
View Code

F、最小公倍数

思路:求最小公倍数的模板

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<string.h>
 4 #include<math.h>
 5 #include<algorithm>
 6 #include<vector>
 7 #include<string>
 8 #include<queue>
 9 #include<map>
10 #include<stack>
11 #include<set>
12 #define ll long long
13 #define maxn 100010
14 #define PI acos(-1.0)    //圆周率
15 const ll INF = 1e18;
16 using namespace std;
17 int gcd(int x,int y)
18 {
19     if(x%y) return gcd(y,x%y);
20     return y;
21 }
22 int main()
23 {
24     int m,n;
25     while(scanf("%d%d",&m,&n)!=EOF)
26     {
27         int ans=m/gcd(m,n)*n;
28         printf("%d
",ans);
29     }
30     return 0;
31 }
View Code

G、小明A+B

思路:无论输入的数据的大小,直接对100取余,然后相加得到的答案再对100取余

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<string.h>
 4 #include<math.h>
 5 #include<algorithm>
 6 #include<vector>
 7 #include<string>
 8 #include<queue>
 9 #include<map>
10 #include<stack>
11 #include<set>
12 #define ll long long
13 #define maxn 100010
14 #define PI acos(-1.0)    //圆周率
15 const ll INF = 1e18;
16 using namespace std;
17 int T;
18 int a,b;
19 int main()
20 {
21     scanf("%d",&T);
22     while(T--)
23     {
24         scanf("%d %d",&a,&b);
25         a%=100;
26         b%=100;
27 
28         int ans=a+b;
29         ans%=100;
30 
31         printf("%d
",ans);
32     }
33 
34     return 0;
35 }
View Code