C语言博客作业04--数组
0.展示PTA总分(0----2)
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] = '\0';
int flag = 0;
int k = 1;
for (int i = 1; a[i] != '\0'; i++) {
for (int j = 0; b[j] != '\0'; j++) {
if (a[i] == b[j]) {
flag = 1;
break;
}
}
if (flag == 0) {
b[k++] = a[i];
b[k] = '\0';
}
flag = 0;
}
int cnt = 0;
for (int i = 0; b[i] != '\0'; 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分)
题目不难 但是全对很难 当数据很大的时候会超时
这时学了个素数筛法很强大实现代码如下:
#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也是质数……
上述过程不断重复,就可以把某个范围内的合数全都除去(就像被筛子筛掉一样),剩下的就是质数了。维基百科上有一张很形象的动画,能直观地体现出筛法的工作过程。