swust oj代码+解析_1165,0284,0074,0042,1171,0026,0189,0078,0046,0077,0209,0129

swust oj 1165,0284(int a[n]\数字根),0074,0042,1171(矩阵相乘 输出对齐),0026/0189,0078(计算生日是星期几),0046,0077(计算员工周工资),0209,0129




1165

1.在输入n后,可以用int a[n]的方式定义数组大小,oj不支持a[]形式

2.注意题目要求,多组还是单组,输入输出格式



0284疑问:

1.输入至0时结束不可以用类似while((scanf("%d",&a))!=0)的表示么

2.对一个数求数字根有更简洁的写法么,如何将两个do while语句合并(使用if else语句实在只是保全之策)




0074:

1.矩阵的定义数组需要比数据多申请一个\0的位置, 故m行n列的数组需要申请a[m][n]
2.思路:输入两个矩阵,矩阵相乘,输出矩阵,用四个大for循环
3.输入矩阵的方法~for的嵌套
4.矩阵相乘的时候用c[i][j] += a[i][k]*b[k][j]感觉不错



0042:
1.oj提交题的时候注意printf时加上\n,否则就PE了
2.整数的相除结果自动取整,不要每次都被坑好不好



1171:
1.利用ah=ah+bh减少变量的个数使行文更简洁
2.输出的对齐:(以整数为例)
v 在"%"和字母之间插进数字表示最大场宽。如:%8d表示在输出一个小于8位的数值时, 将在前面补空格使其总宽度 为8位;

v 可以控制输出左对齐或右对齐, 即在"%"和字母之间加入一个"-" 号可说明输出为左对齐, 否则为右对齐。例如: %-7d 表示输出7位整数左对齐 ;

v 若想在输出值前加一些0, 就应在场宽项前加个0。例如:%02d 表示在输出一个小于2位的数值时, 将在前面补0使其总宽度 为2位;%022表示得到22位数,不足用0补足;















 
图片

0026:

1.实现多组输入用 while(scanf("%d %d",&a1,&b1)!= EOF),当输入变成多组之后,就要考虑数据再一次的初始化。

2.求翻转数的核心:do while部分 

图片

0189:
这道题上耗了好久上次碰它是上个月了都。

解决一个问题要从思路开始,混乱的思路并不能边写便理清,而是从头开始乱到底。找到了大的方向,细枝末节的问题可以一个一个慢慢改,也不会觉得混乱。

《天龙八部之宿敌》陪这两篇代码。
晚安。







0078(switch,判断平闰年)
 虽然看上去只有几十行,但对于我这种学渣已经很费神费力了.
[思路]第一个for循环判断平年还是闰年,据此对a赋值,顺便把前面年份的天数赋给total.
第二个for循环把当前年的前面月份的天数赋给total,顺便把日期的天数赋给total.
最后switch语句根据total的值输出星期几.
..........语段分割线......
[经验]1.for着重于循环次数的控制,while着重于循环条件的控制.(有待深入理解区别)
2.每个数据在使用之前需要一个赋值,通过scanf或者i=1类型.for中i=1,在开头还是需要为i赋值,否则year=1的特殊情况便无i值(然而其实此题好像不必).
3.switch语句中需要break,不是没有也不是continue,因为需要退出整个switch语句.
4.若switch()的括号中是一个数字,
 那么case后面如果是数字就能运行;但你如果是 '1'就代表1是个字符,而不是数字(所以之前用case'+'就没问题).
5.if语句的else与else if的区别:else if后面必须有一个判断条件,一般else就够用了.
6.if语句小括号里,非:(!(表达式))  且(表达式1 && 表达式2)       或(表达式1 || 表达式2).好像一般两个表达式的非可以用另外两种来表示,目前不清楚两个表达式的非怎么表示.
7.if(a==0)才是判断,if(a=0)是什么鬼,暂时还不能吃.
8.经检验,total+=365 这种表达方式oj是支持的.
9.对于判断平闰年,有更简单的方式(偷来的):
if(a%4==0&&a%100!=0||a%400==0).




图片


图片

图片






0046
 第一张是自己写的,看看别人写的,好像是我想法太复杂,用了很多的单词表示,不过求次方还是会了
图片

图片

0077
 ***float--%f     double--%lf
***if语句中的或与非,|| & ! 都写在括号里面
***当你不清楚小数点后是否保有有效数据的时候,你可以用%g输出如printf("%g\n",answer);
如answer为12.50自动输出12.5,若answer为12.00自动输出12
[优化]printf语句可以合并滴。
图片


0209

这个问题千回百转的,算来算去要用很多步骤,运算时间也会拉长很多,那么,为什么不转换一下思维使之变得简洁呢.

每次%2,得到最后一位k位,翻转之后会到第k位,k++,那么第k位的转换成二进制会乘2的n-1-k次方,一步到位罢.



#include<stdio.h>
#include<math.h>
int main()
{
    int m,n,a,sum,k;
	while(scanf("%d %d",&m,&n)!=EOF)
	{
		sum=k=0;
		while(k<n)
		{
			a=m%2;
			sum+=a*(int)pow(2,n-1-k);
			m/=2;
			k++;
		}
		printf("%d\n",sum);
	}
    return 0;
}





0129(轰炸)
#include<stdio.h>
int main()
{
	int i,j,t,n,x[705],y[705],time,max=2;
	while(scanf("%d",&n)!=EOF)
	{
		max=2;
		for(i=0;i<n;i++)
		{
			scanf("%d %d",&x[i],&y[i]);
		}
		for(i=0;i<n;i++)
		{
			for(j=0;j<n && i!=j;j++)
			{
				time=2;
				for(t=0;t<n && t!=i && t!=j;t++)
				{
					if((y[i]-y[j])*(x[i]-x[t])==(x[i]-x[j])*(y[i]-y[t]))
						time++;
				}
				if(time>max)max=time;
			}
		}
		printf("%d\n",max);
	}
	return 0;
}


思路在代码里哦



移自本人QQ空间
written by Sneexy.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值