第一题 Repeating Decimals
分析
这道题是找一个数除以另一个数然后输出结果,将循环节用括号包裹起来,
如果循环节长度超过50位就只输出前50位,剩下的用"…"代替。第二行前面
有三个空格。(一定要注意输出格式)
如果被除数出现重复,那么就出现了循环节,也就相当于
n除以m的余数只能是0~m-1,当计算m+1次时至少存在一个余数相同,
即为循环节;存储余数和除数,输出即可。
#include <stdio.h>
#include <string.h>
int qot[3500], rmd[3500];
int main()
{
int a, b;
while(scanf("%d %d", &a, &b) != EOF){
int m = 0, n = 0;
memset(qot, 0, sizeof(qot));
memset(rmd, 0, sizeof(rmd));
qot[0] = a / b;
rmd[0] = a % b;
for(int i = 1; ; i++){
qot[i] = rmd[i-1] * 10 / b;
rmd[i] = rmd[i-1] *10 % b;
for(int j = 1; j < i; j++){
if(qot[j] == qot[i] && rmd[j] == rmd[i]){
m = i;
n = j;
break;
}
}
if(n) break;
}
printf("%d/%d = %d.", a, b, qot[0]);
for(int i = 1; i < n && i <= 50; i++)
printf("%d", qot[i]);
printf("(");
for(int i = n; i < m && i <= 50; i++)
printf("%d", qot[i]);
if(m > 50) printf("...");
printf(")\n");
printf(" %d = number of digits in repeating cycle\n\n", m-n);
}
return 0;
}
第二题 Kickdown
分析
可以将一个长条s1固定,另外一个s2依次后移寻找能否嵌套,
如果从头至尾扫描s2的值和s1的值的和都符合高度不超过三,
那就可以认为可以嵌套,否则将s2的头位置继续后移。
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char s[105], t[105];
int len1, len2, len;
while(cin>>s>>t)
{
int i, j, x, y;
int len1 = strlen(s), len2 = strlen(t);
for( i=0; i<len1; i++ )
{
bool flag = true;
for( j=0; j<len2 && j+i<len1 ; j++ )
if(s[i+j]=='2'&&t[j]=='2'){
flag = false;
break;
}
if(flag)
break;
}
x = max(len1, len2+i);
i = j = 0;
for( i=0; i<len2; i++ )
{
bool flag = true;
for( j=0; j<len1 && j+i<len2; j++ )
if(t[i + j] == '2' && s[j] == '2'){
flag = false;
break ;
}
if(flag)
break;
}
y = max(len2, len1+i);
cout<<min(x,y)<<endl;
}
return 0;
}