总的来说就是把布置的题写了一下,有些没写,太难了,有些有思路提交却总是答案错误,下面就是一些题的题解,还有我的一些想法。
vj上的
A、A+B
代码:
#include<stdio.h>
char a[10000],b[10000],c[10000];
int main()
{
int t,i,j,k;
scanf("%d",&t);
getchar();
for(i=0;i<10000;i++)
{
c[i]=0;
}
for(k=1;k<=t;k++)
{
for(i=0;i<10000;i++)
{
c[i]=0;
}
scanf("%s",a);
getchar();
scanf("%s",b);
getchar();
int l1=strlen(a),l2=strlen(b),w=0,h=0;
for(i=l1-1,j=l2-1;j>=0&&i>=0;j--,i--,h++)
{
if(w>0)
{
c[h]++;
w=0;
}
c[h]+=a[i]+b[j]-'0';
if(c[h]>'9')
{
c[h]-=10;
w++;
}
}
while(j>=0)
{
if(w>0)
{
c[h]++;
w=0;
}
c[h]+=b[j];
if(c[h]>'9')
{
c[h]-=10;
w++;
}
j--;
h++;
}
while(i>=0)
{
if(w>0)
{
c[h]++;
w=0;
}
c[h]+=a[i];
if(c[h]>'9')
{
c[h]-=10;
w++;
}
i--;
h++;
}
if(w>0)
{
c[h]+='1';
w=0;
}
else h--;
printf("Case %d:\n%s + %s = ",k,a,b);
for(;h>=0;h--)
{
printf("%c",c[h]);
}
printf("\n");
if(k<t)printf("\n");
}
return 0;
}
这是可以说是写过的题了,一开始没看清题目要求,少了换行,导致提交多次不通过,后来看清才提交通过。
思路:就是把A和B都看做是一个字符串,以及他们的答案也用字符串来表示,再就是用一个变量来当作是一个进位器,就和手算加法一样各个位置的数相加,结果大于十就进一,就是要考虑完全进位器的状态,以及A和B的长短可能是不一样的,多方位考虑,即可。
B、开关灯
代码:
#include<stdio.h>
int main()
{
int n,m,j,k,l,f=0,i;
scanf("%d %d",&n,&m);
int a[n+1];
for(i=1;i<=n;i++)
{
a[i]=0;
}
if(m>1)
{
for(i=2;i<=m;i++)
{
for(j=i;j<=n;j+=i)//只考虑i的倍数的灯
{
if(a[j]==0)
{
a[j]=1;
}
else a[j]=0;//做相反处理
}
}
}
for(i=1;i<=n;i++)
{
if(f==0&&a[i]==0)
{
printf("%d",i);
f=1;
}
else if(a[i]==0&&f==1)
{
printf(",%d",i);
}
}
return 0;
}
思路:这道题比较简单,就是模拟一下就好了,用一个变量i来代替其编号,由于n不是很大,我们就可以进行一一遍历,每一个编号遍历一整遍,而且只处理i的倍数,最后输出就好了。
C、学生成绩查找系统
有点思路,又感觉思路不是很正确,又感觉写不出来,我的想法就是这个就是用一个二维字符数组储存名字,还有一个数组来储存成绩,然后再用用一个循环来讨论,一个一个判断find后面的字符串,遍历这个二维字符数组,然后看是否与其中一个相同,若读到end就停止循环。就是有一个问题就是,这个insert后面的字符串是不固定的,这个不太懂如何输入,所就一直搁浅在这里,无从下手。
D、百钱买百鸡
代码:
#include<stdio.h>
int main()
{
int n,i,j,f=0;
scanf("%d",&n);
int x=0,y=0,z=0;
for(i=0;i<=n/5;i++)
{
for(j=0;j<=n/3;j++)
{
if(i*5+j*3+(n-i-j)/3.0==n)
{
f=1;//标记看是否满足条件
printf("%d %d %d\n",i,j,n-i-j);
}
}
}
if(f==0)
{
printf("No Answer.");
}
return 0;
}
思路:设公鸡买x只,母鸡买y只,小鸡买z只,满足两个关系式:1. x+y+z=n 2. 5x+3y+z/3=n。
直接用两个循环来判断就行了。
E、特殊关系
这个题我写出来的代码可以做到题目的要求,但就是超时了,但就是不知道怎么优化,挺气人的
代码:
#include<stdio.h>
int main()
{
int n,i,j,k=0;
scanf("%d",&n);
getchar();
char a[n][10],b[n][2];
for(i=0;i<n;i++)
{
scanf("%s",a[i]);
getchar();
scanf("%s",b[i]);
getchar();
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i==j)continue;//碰到自己就跳过
if(a[i][0]==b[j][0]&&a[i][1]==b[j][1]&&a[j][0]==b[i][0]&&a[j][1]==b[i][1])
{
k++;
}
}
}
printf("%d",k/2);//一个判断了两次
return 0;
}
我的思路:我先就是用两个二维字符数组,来分别存储每一行的x、y,再开一个嵌套的循环来一个一个遍历,判断后两个和前两个字符,看是否题目所说关系,符合就加一,可最终提交却显示超时,却也无能为力了。
F、字符展开
这个太难了,完全没思路。
G、回文猜想
代码:
#include<stdio.h>
int a[10000];
int huiwenjudge(int n)
{
int i=n,j=0;
while(i)
{
j=j*10+i%10;
i/=10;
}
return n==j;
}//判断回文
void add(int n)
{
int i=n,j=0,k=0,l;
a[0]=i;
while(1)
{
if(huiwenjudge(a[k]))
{
printf("%d\n",k);
break;
}
k++;
j=0;
while(i)
{
j=j*10+i%10;
i/=10;
}//取其倒序数
a[k]=a[k-1]+j;//将每一步结果储存,便于接下来输出
i=a[k];
}
for(l=0;l<=k;l++)
{
printf("%d",a[l]);
if(l!=k)printf("-->");
else printf("\n");
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)//多组输入
{
add(n);
}
return 0;
}
思路:先是判断它是否是回文数,然后就是依据题意来,一步一步进行模拟,再把每一步的结果储存在一个数组中,最后在进行输出。
但是一直提交不了,总是提交失败。很惆怅。
H、赶时间
代码:
#include<stdio.h>
int main()
{
int h,m,s;
int h1,m1,s1,t=0;
scanf("%d:%d:%d",&h1,&m1,&s1);
scanf("%d:%d:%d",&h,&m,&s);
if(s1<s)
{
m1--;
s1+=60;
t+=s1-s;
}
else t+=s1-s;
if(m1<m)
{
h1--;
m1+=60;
t+=(m1-m)*60;
}
else t+=(m1-m)*60;
if(h1>h)t+=(h1-h)*3600;
printf("%d",t);
return 0;
}