面试题题解
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 }
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 }
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 }
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 }
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 }
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 }
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 }