zoukankan      html  css  js  c++  java
  • C语言博客作业04--数组

    0.展示PTA总分(0----2)

    Ms9LZ9.png
    Ms9zRK.png
    MsCZJP.png

    1.本章学习总结(2分)

    1.1 学习内容总结

    • 哈希数组用法:就是将一个数组中的内容作为另一个数组(该数组的数据全部初始化为零)的下标,然后输入一个数时,直接将该数作为另一个下标数组的下标,以此来统计一个数出现的次数或者判断有无重复数据。目前学过的案例有pta里的判断重复数据,就是用上述方法来判断是否出现重复数据,如果输入一个数,该数所对应的下标数组内容如果是0的话就将其改为1,如果是一的话就说明该数已经出现过一次了,就说明该数是重复数据。

    • 数组中删除数据可以将重该位置开始的数据,把所有数据都往前移一个位置,也就是将该位置的数据用后一个数据来代替。也可以重新定义一个数组,重新存放除要删除的数据之外的所有数据。也可以用下标法来删除数据,即删除该数据所对应的数据下标,然后将之后的数组下标往前移一格。

      1.2 本章学习体会

      没有建议非常好

      500行吧

      2.PTA实验作业(7分)

    #include<stdio.h>
    int main() {
    	char a[80];
    	gets(a);
    	char b[80];
    	b[0] = a[0];
    	b[1] = '';
    	int flag = 0;
    	int k = 1;
    	for (int i = 1; a[i] != ''; i++) {
    		for (int j = 0; b[j] != ''; j++) {
    			if (a[i] == b[j]) {
    				flag = 1;
    				break;
    			}
    		}
    		if (flag == 0) {
    			b[k++] = a[i];
    			b[k] = '';
    		}
    		flag = 0;
    	}
    	int cnt = 0;
    	for (int i = 0; b[i] != ''; i++) {
    		cnt++;
    	}
    	for (int i = 0; i < cnt - 1; i++) {
    		for (int j = 0; j < cnt - 1 - i; j++) {
    			if (b[j] > b[j + 1]) {
    				char temp = b[j];
    				b[j] = b[j + 1];
    				b[j + 1] =temp;
    			}
    		}
    	}
    	puts(b);
    }
    
    就遍历删除重复字符接着冒泡排序

    也可以用哈希数组,用空间换时间,ascll码最大到255,一旦数组的值为1就说明已存在不必再存入

    实现代码如下:

    #include<stdio.h>
    #include<string.h>
    int main() {
    	char a[80];
    	gets(a);
    	int b[300] = { 0 };//哈希数组   数组初始化都为0
    	int n = strlen(a);
    	int k = 0;
    	for (int i = 0; i < n; i++)	//b数组的下标就是ascll码
    	{
    		if (b[a[i]] == 1) {
    			continue;
    		}
    		b[a[i]]++;	
    	}
    	for (int i = 0; i < 200; i++) {   //遍历输出如果为1就说明有这个字符
    		if (b[i] == 1) {
    			printf("%c", i);
    		}
    	}
    }
    

    //特地花时间去写的呢!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    3.阅读代码(-2--1分)

    MseGFg.png

    题目不难 但是全对很难 当数据很大的时候会超时

    这时学了个素数筛法很强大实现代码如下:

    #include<stdio.h>
    int p(int n) {
    	int a[1000000] = { 0 };
    	int cnt = 0;
    	for (int i = 2; i <= n; i++) {
    		if (!a[i]) {
    			cnt++;
    			for (int j = 2 * i; j <= n; j += i) {
    				a[j] = 1;
    			}
    		}
    	}
    	return cnt;
    }
    int main() 
    {
    	int n;
    	scanf("%d", &n);
    	int c = p(n);
    	printf("%d", c+1);
    }
    
    

    代码解析:

     首先,2是公认最小的质数,所以,先把所有2的倍数去掉;然后剩下的那些大于2的数里面,最小的是3,所以3也是质数;然后把所有3的倍数都去掉,剩下的那些大于3的数里面,最小的是5,所以5也是质数……
      上述过程不断重复,就可以把某个范围内的合数全都除去(就像被筛子筛掉一样),剩下的就是质数了。维基百科上有一张很形象的动画,能直观地体现出筛法的工作过程。

  • 相关阅读:
    windows live sync, mesh, skydrive
    忘记SQL SERVER密码的解决
    处理ObjectDataSource调用中DAL层中的异常
    C#中获取应用程序路径的方法(集合)
    datatable复制一行数据到本表
    [Yii Framework] yii中如何在查询的时候使用数据库函数
    [Yii Framework] yii的路由配置
    [Yii Framework] 已经定义的命名空间常量
    [Yii Framework] yii中关于filter
    [Yii Framework] yii中如何不加载layout
  • 原文地址:https://www.cnblogs.com/Chenccc/p/11878391.html
Copyright © 2011-2022 走看看