今天除了上数学课和心里考试全部坐在电脑前刷题
启航oj 4,
菜鸟杯 oj3,
因为我是一个入门比较晚的菜鸟所以我唯一能做的就是挤出所有的时间全部用来补别人已经明白的东西。
今天主要的收获就是 字符串三个函数的应用 字符与二维数组的混合运用;大数的乘法;
1.熟悉了函数strlwr的作用是将字符串中的大写字母转 化为小写字母。
2.熟悉了函数strcmp的作用是将a字符串与b字符串中的每一个字符根据ASCII码值的大小进行比较如果1中的字符串与2中的字符串相同则strcmp函数的值为0,如果字符串1大于字符串2,则函数值返回为一个正整数,反之则返回一个负整数。
上面两个都从我的角度两说比较简单能懂的知识点
下面这个例题我做到吐血debug都debug哭了从早上10.做到下午一点我确实很菜
#include<stdio.h>
#define N 100
int main()
{ int Q,W;
int i;
int A,B,C,D,E,F;
char Z[N]={0};
int a[20][2]={{00,00},{01,10},{02,20},{03,30},{04,40},{05,50},{10,01},{11,11},{12,21},{13,31},{14,41},{15,51},{20,02},{21,12},{22,22},{23,32},{00,00}};//列举出所有的回文时间
gets(Z);
A=(Z[0]-'0')*10;
B=Z[1]-'0';
C=(Z[3]-'0')*10;
D=Z[4]-'0';
E=A+B;//小时的十进制数
F=C+D;//分钟的十进制数
for(i=0;i<17;i++)
{
if((E==a[i][0])&&(F<a[i][1]))//判断小时与分钟与回文时间之间的关系 再去选择输出是输出哪一 个回文时间
{
Q=a[i][0];
W=a[i][1];
break;
}
else if(E==a[i][0]&&(F>=a[i][1]))
{
Q=a[i+1][0];
W=a[i+1][1];
break;
}
else if(E<a[i][0])
{
Q=a[i][0];
W=a[i][1];
break;
}
}
printf("%02d:%02d",Q,W);
return 0;
}
//之所以会做这么久是因为我的二维数组确实很薄弱我需要在这方面多加练习,而且我的C语言知识体系几乎全部来自于自学因为我们班比较特殊是预科和职高的混合班老师上课直接飞一般的快所以有一些比较细的东西我还没有充分的了解到。
大数的乘法(我觉得还好因为之前做过大数的加法唯一变了的地方就是下方标记的算法关键,就是把乘法变成加法)特别要注意前导当下标=len-1的数组可能存在等于0和不等于0的情况要分情况讨论我在这里错了四次提交 要是等于0要直接去掉。
#include<stdio.h>
#include<string.h>
#define N 100
int main()
{
int i=0,j=0,l=0;
int A[N],B[N],C[N+N]={0},len,len1,len2;
char a[N],b[N];
gets(a);
gets(b);
len1=strlen(a);
len2=strlen(b);
for(i=len1-1;i>=0;i--)
{
A[j]=a[i]-'0';//反转字符串a中的数字
j++;
}
for(i=len2-1;i>=0;i--)
{
B[l]=b[i]-'0';//反转字符串b中的数字
l++;
}
len=len1+len2;//两个数组相乘的长度等于两个数组的长度分别相加
for(i=0;i<len1;i++)//整个算法的关键
{
for(j=0;j<len2;j++)
{
C[i+j]=C[i+j]+A[i]*B[j];//每个位数上所含有的数,先不进位;
}
} //整个算法的关键
for(i=0;i<len;i++)
{
if(C[i]>=10)
{
C[i+1]=C[i+1]+C[i]/10;
C[i]=C[i]%10;
}
}
//此时i=len-1;
while(C[i]==0) i--;//判断最后一位是不是为0如果是0的话就去掉,如果不是0的话就进行输出
while(i>=0)
{
printf("%d",C[i]);
i--;
}
return 0;
}
虽然我很菜,
但是我不想输。
加油!