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]感觉不错
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).
[思路]第一个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
0209
0129(轰炸)
0077
***float--%f double--%lf
***if语句中的或与非,|| & ! 都写在括号里面
***当你不清楚小数点后是否保有有效数据的时候,你可以用%g输出如printf("%g\n",answer);
如answer为12.50自动输出12.5,若answer为12.00自动输出12
[优化]printf语句可以合并滴。
如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.