zoukankan      html  css  js  c++  java
  • c-指针

    一、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('
    ');
    	}
    	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.还没掌握的地方:

    • 对于各类库函数的用处还不够熟悉
  • 相关阅读:
    刷题总结——蚯蚓(NOIP2016DAY2T2)
    刷题总结——愤怒的小鸟(NOIPDAY2T3)
    算法复习——高斯消元(ssoi)
    算法复习——高精度集合
    刷题总结——系列维护(ssoi)
    刷题总结——传送带(四川省选)
    算法复习——数位dp(不要62HUD2089)
    算法复习——单调队列(sliding windows,ssoi)
    刷题总结——road(ssoi)
    linux命令学习笔记(61):tree 命令
  • 原文地址:https://www.cnblogs.com/wu98/p/8037638.html
Copyright © 2011-2022 走看看