一、PTA实验作业
题目1:判断回文字符串
1.本题PTA提交列表
2. 设计思路
bool palindrome( char *s ):
定义指针e指向字符串的最后一个字符 s[ strlen(s)-1 ].
loop
如果 *s 不等于 *e
return 0 //不是回文
end
s++ //偏移到下一个字符;
e-- //偏移到上一个字符;
until: s>=e //全部对应
return 1
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
一开始使用函数自减,导致编译错误.
题目2:报数
1.本题PTA提交列表
2. 设计思路
定义rest[n]储存圈中的人的号数,index表示退圈的人对应的rest[]的下标.
for i=0 to n-1
rest[i]=i;
end
for i=1 to n
//要退出的rest[]下标为:上一次退出的人的下标加 m-1 (-1因为退圈者位置被取代),其结果取余现有人数.
index=(index+m-1)%(n-i+1)
//rest[index]是第i个退出的.
out[ rest[index] ]=i
for u=index to n-i-1
rest[u]=rest[u+1]
end
end
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
- 一开始没看清题目,以为是按退出顺序输出对应号数.
题目3:统计大于等于平均分人数
1.本题PTA提交列表
2. 设计思路
定义sum=0统计分数大于平均分的人数.
for i=0 to i=n-1
*aver += *s[i]/n.
end
for i=0 to i=n-1
如果 *s[i]>*aver ,sum++.
end
return sum
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
- 无问题
二、截图本周题目集的PTA最后排名。
三、代码
1.利用位运算实现两个整数相加
int Add(int a,int b){
if(!b) return a;
int sum,carry;
sum=a^b;
carry=(a&b)<<1;
return Add(sum,carry);
}
a^b先将不需要进位的数字相加
a&b找出需要进位的数 即 1&1
利用递归完成所有进位 当某一层中的b等于0时,表示没有再需要进位的数
例如:
3+1
a1: 00000011
b1: 00000001
sum1: 00000010
carry1: 00000001(<<1) --> 00000010
a2(s1):00000010
b2(c1):00000010
s2: 00000000
c2: 00000010(<<1) -> 00000100
a3: 00000000
b3: 00000100
s3: 00000100
c3: 00000000
a4: 00000100
b4=0 return a4=4
2.高精度运算.
#include<stdio.h>
#include<string.h>
#define MAX 999
int main()
{
char num[MAX];
scanf("%s",num);
int i,len_m=strlen(num);
static int add[MAX];
for(i=0;i<len_m;i++) add[i]=num[len_m-i-1]-'0'; //反向储存
while( scanf("%s",num)!=EOF ){
int len=strlen(num);
len_m=len_m>len?len_m:len; //以较长的数为准
for(i=0;i<len;i++){
//相加并进位.
add[i]+=num[len-i-1]-'0';
add[i+1]+=add[i]/10;
add[i]%=10;
}
if(add[len_m]) len_m++;
for(i=len_m-1;i>=0;i--) printf("%d",add[i]); //反向输出
putchar('\n');
}
return 0;
}
- 系统中整数的精度有限,对于几百几千位的数字的储存,数据会溢出
因此需要用字符串形式存储整数,并按位逐位运算,运算过程中需考虑进位问题。
如果代码要考虑负数,两整数符号相同用加法运算,不同为减法运算,减法还要比较二数的绝对值大小,来确定最终结果的符号及减数与被减数的安排顺序。
四、本周学习总结
1.指针
- 定义: 指针类型 *指针名; (int *p;)
- 使用: 指针存放的是地址.可以令指针指向变量,数组,函数或结构体等,通过指针访问其内存,直接修改其内存达到改变值的目的.用于函数中可以实现将数据返回到主函数.
2.结构体变量的内存分配:
- 第一个成员起始地址为0,之后每个数据成员存储位置都从该成员大小(int为4)的整数倍开始.
- 结构体的总大小,即sizeof的结果必须是其最大成员的整数倍.
- 定义结构体指针时,只会分配指针大小的空间用于存放地址.
3.typedef struct和struct
- 如果定义结构体类型时用 typedef :
typedef struct Student{
int num;
}Stu;
声明变量的时候就可用:Stu s; 即可以用 Stu 代替 struct Student(如果没有typedef要用struct Student s;声明)
- 如果typedef struct Student省略Student,声明时只能用Stu s;
4.还没掌握的地方:
- 对于各类库函数的用处还不够熟悉