一.目的:
总结一下之前写过的两个有意思的题。一个是关于字符串的处理,一个考验思维。
题目大意
1:cantor表
http://codevs.cn/problem/1083/
2:笨小猴
http://codevs.cn/problem/1053/
Cantor表的解题思路
1:一开始我想的是创建一个二维数组来存储数据,因为每一个数据都是他所在的行比上对应的列,而
且排列的时候它的顺序是不一样的,当列为偶数时它是斜着由上到下的顺序,而当列为奇数时它是斜着由下到上。
2:后来由于它的输出是个比值形式,我就感觉存储每一个值没有必要,因为在计算机中它保存的是一
个整形数而不是比值形式。因为每次斜着数对应的个数为1,2,3,4—,这个和它的列数是一一对应的,所以由所输入的n来确定它的列,再用一个变量来记录他在这条斜边上操作的次数,然后改变分子和分母就行。
代码:
# include <stdio.h>
# define MAX 100;
int c = 0;
int main(void)
{
int n,i,j,k;
scanf("%d",&n);
double sum = 0;
for(i = 1; i<=1000; i++)
{
int t = 0;//t是用来保存他在斜边上的处理次数
for(j = 1; j<=i; j++)
{
sum+=1;
t+=1;
if(sum == n)//找出所对应的列值
{
c = t;
k = i;
break;
}
}
}
if(k%2==0)
{
int a = 1;
int b = k;
for(j = 1; j<c; j++)
{
a+=1;
b-=1;
}
printf("%d/%d\n",a,b);
}
else{
int a = k;
int b = 1;
for(j = 1; j<c; j++)
{
a-=1;
b+=1;
}
printf("%d/%d\n",a,b);
}
return 0;
}
笨小猴的解题思路:
笨小猴这道题很简单,就是找字符串中某一个字母出现最多的次数,和出现最小的次数,就这一块有一些意思,
str[a[i]-‘a’]++;在对该数组进行排序,找出第一个大于0的次数,就是所对应最小的次数。
代码:
# include <stdio.h>
# define MAX 100;
int c = 0;
int main(void)
{
int n,i,j,k;
scanf("%d",&n);
double sum = 0;
for(i = 1; i<=1000; i++)
{
int t = 0;//t是用来保存他在斜边上的处理次数
for(j = 1; j<=i; j++)
{
sum+=1;
t+=1;
if(sum == n)//找出所对应的列值
{
c = t;
k = i;
break;
}
}
}
if(k%2==0)
{
int a = 1;
int b = k;
for(j = 1; j<c; j++)
{
a+=1;
b-=1;
}
printf("%d/%d\n",a,b);
}
else{
int a = k;
int b = 1;
for(j = 1; j<c; j++)
{
a-=1;
b+=1;
}
printf("%d/%d\n",a,b);
}
return 0;
}