预备第一周总结

总的来说就是把布置的题写了一下,有些没写,太难了,有些有思路提交却总是答案错误,下面就是一些题的题解,还有我的一些想法。

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值