这周的编程题还是有点难度的,而且代码有的比较长不好截图分享到群相册,发文本又太没意思,就直接一起记录在一个博客里好了:(所有的程序都只需要 #include <stdio.h> 所以不每个都写了)
7-1 查找整数 (10 分)
int main()
{
int N, X, t, i;
scanf("%d%d", &N, &X);
for(i = 0; i < N; i++)
{
scanf("%d", &t);
if(t == X)
{
printf("%d\n", i);
return 0;
}
}
if(i == N) printf("Not Found\n");
return 0;
}
7-2 将数组中的数逆序存放 (20 分)
int main()
{
int n, a[10];
scanf("%d", &n);
for(int i = 0; i < n; i++) scanf("%d", &a[i]);
for(int i = n - 1; i > 0; i--) printf("%d ", a[i]);
printf("%d\n", a[0]); // 行末不得有多余空格
return 0;
}
7-3 选择法排序 (20 分)
int main()
{
int n, a[10];
scanf("%d", &n);
for(int i = 0; i < n; i++) scanf("%d", &a[i]); // 先全读进来
for(int i = 0; i < n - 1; i++) // 每次选一个最小的和有序列后一位交换
{
int minV = a[i], minIdx = i; // 最小值,最小值位置
for(int j = i + 1; j < n; j++)
if(a[j] < minV)
{
minV = a[j];
minIdx = j;
}
if(minIdx != i)
{
int tmp = a[i];
a[i] = a[minIdx];
a[minIdx] = tmp;
}
}
for(int i = n - 1; i > 0; i--)
printf("%d ", a[i]);
printf("%d\n", a[0]); // 行末不得有多余空格
return 0;
}
7-4 交换最小值和最大值 (15 分)
int main()
{
int n, a[10];
scanf("%d", &n);
for (int i = 0; i < n; i++) scanf("%d", &a[i]);
int max = -1, maxi = -1, min = 2147483647, mini = -1; // INT_MAX
for(int i = 0; i < n; i++)
if(a[i] < min)
{
min = a[i];
mini = i;
}
a[mini] = a[0];
a[0] = min;
for(int i = 0; i < n; i++) // 必须重新计算,因为交换min之后,最大值位置可能变了
if(a[i] > max)
{
max = a[i];
maxi = i;
}
a[maxi] = a[n - 1];
a[n - 1] = max;
for(int i = 0; i < n; i++)
printf("%d ", a[i]);
return 0;
}
7-5 简化的插入排序 (15 分)
int main()
{
int N, a[10], X;
scanf("%d", &N);
for(int i = 0; i < N; i++)
scanf("%d", &a[i]);
scanf("%d", &X);
int i;
for(i = 0; i < N; i++)
if(a[i] > X)
{
for(int j = N; j > i; j--)
a[j] = a[j - 1];
a[i] = X;
break;
}
if(i == N) // 都比X小
a[N] = X;
for(int i = 0; i <= N; i++)
printf("%d ", a[i]); // 每个数字后面有一个空格
return 0;
}
7-6 求一批整数中出现最多的个位数字 (20 分)
int main()
{
int N, a[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, maxTime = 0;
scanf("%d", &N);
for (int i = 0; i < N; i++)
{
int t;
scanf("%d", &t); // 非负整数
do
{
++a[t % 10];
t /= 10;
} while (t != 0) // do while处理数字为0的情况
}
for (int i = 0; i < 10; i++)
if (a[i] > maxTime)
maxTime = a[i];
printf("%d:", maxTime);
for (int i = 0; i < 10; i++)
if (a[i] == maxTime)
printf(" %d", i);
return 0;
}
7-7 输出数组元素 (15 分)
int main()
{
int N, a[10];
scanf("%d", &N);
for (int i = 0; i < N; i++) scanf("%d", &a[i]); // n个整数
for(int i = 0; i < N - 1; i++)
{
printf("%d", a[i + 1] - a[i]);
if((i + 1) % 3 == 0 || i == N - 2) printf("\n");
else printf(" ");
}
return 0;
}
7-8 找出不是两个数组共有的元素 (20 分)
这道题网上很多答案用了三个数组,我用了一个数组,flag数组是用来代替数组删除操作的,不怎么影响时间复杂度。
int main()
{
int an, ancnt, bn, tmp, cnt = 0, first = 1;
// C static数组默认全初始化为0, flag[i]为0表示res[i]这位数不输出
static int res[40], flag[40]; // 用flag数组代替删除操作
scanf("%d", &an);
ancnt = an;
for (int i = 0; i < an; i++) // 读第一个数组, 跳过重复的
{
scanf("%d", &tmp);
int j = 0;
for (j = 0; j < cnt; j++)
if (flag[j] == 1 && res[j] == tmp)
break;
if (j == cnt)
{
res[cnt] = tmp;
flag[cnt] = 1;
++cnt;
}
else
--ancnt; // 记录第一个数组存入res多少个数!!
}
scanf("%d", &bn);
for (int i = 0; i < bn; i++) // 读第二个数组, res中出现过的话,对应位flag归0,继续下一个数
{
scanf("%d", &tmp);
int j = 0;
for (j = 0; j < cnt; j++)
if (res[j] == tmp) // 这里不能判断flag!!!!!!因为只要出现过就一定不需要了
break;
if (j == cnt) // res中没出现过
{
res[cnt] = tmp;
flag[cnt] = 1;
++cnt;
}
else if (j < ancnt) // 在第一个数组中出现过
flag[j] = 0;
// 在第二个数组中重复了就直接跳过
}
for (int i = 0; i < 40; i++)
if(flag[i] == 1 && first == 1)
{
printf("%d", res[i]);
first = 0;
}
else if(flag[i] == 1)
printf(" %d", res[i]);
return 0;
}
7-9 求整数序列中出现次数最多的数 (15 分)
int main()
{
int N = 0, num = 0, a[1000], maxTime = -1, maxIdx = -1;
static int cnt[1000];
scanf("%d", &N);
for (int i = 0; i < N; i++)
{
int tmp, j;
scanf("%d", &tmp);
for (j = 0; j < num; j++)
if (a[j] == tmp)
{
++cnt[j];
break;
}
if (j == num)
{
a[num] = tmp;
cnt[num] = 1;
++num;
}
if (cnt[j] > maxTime)
{
maxTime = cnt[j];
maxIdx = j;
}
}
printf("%d %d\n", a[maxIdx], maxTime);
return 0;
}
7-10 求最大值及其下标 (20 分)
int main()
{
int n, tmp, maxV = -2147483648, maxIdx = -1;
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%d", &tmp);
if(tmp > maxV)
{
maxV = tmp;
maxIdx = i;
}
}
printf("%d %d\n", maxV, maxIdx);
return 0;
}
7-11 特殊a串数列求和 (20 分)
int main()
{
int a, n, sum = 0;
scanf("%d%d", &a, &n);
// 2 + 22 + 222 就是一个200,两个20,三个2
for(int i = 1; i <= n; i++)
sum += a * (int)pow(10, n - i) * i;
printf("s = %d\n", sum);
return 0;
}
7-12 兔子繁衍问题 (15 分)
这道题其实手算几个之后就找到规律了,其实就是斐波那契数列:
第几个月:1、2、3、4、5
几对兔子:1、1、2、3、5
int main()
{
int n, f1 = 1, f2 = 1, months = 0;
scanf("%d", &n);
for (months = 1;; months++)
{
if(f1 >= n)
{
printf("%d\n", months);
return 0;
}
f2 = f1 + f2;
f1 = f2 - f1;
}
return 0;
}