WShit

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一、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.还没掌握的地方:

  • 对于各类库函数的用处还不够熟悉
posted on 2017-12-17 12:33  嗡嗡_嗡  阅读(286)  评论(4编辑  收藏  举报