算法笔记刷题(100000569-100000571)
100000569
A
插入排序
scanf
以空格,回车,制表符结束输入
#include <stdio.h>
int main()
{
int a[10],i,j,insert;
for (i = 0; i < 9; ++i) {
scanf("%d", &a[i]);
}
scanf("%d", &insert);
for (i = 0; i < 9; ++i) {
if (insert<=a[i]) {
for (j = 9; j > i; --j) {
a[j] = a[j - 1];
}
a[i] = insert;
break;
}
}
if (a[8] < insert) {
a[9] = insert;
}
for (i = 0; i < 10; ++i) {
printf("%d\n", a[i]);
}
return 0;
}
B
逆序:对称的数交换
#include <stdio.h>
int main()
{
int a[10],i,temp;
for (i = 0; i < 10; ++i) {
scanf("%d", &a[i]);
}
for (i = 0; i < 5; ++i) {
temp = a[i];
a[i] = a[9 - i];
a[9 - i] = temp;
}
for (i = 0; i < 10; ++i) {
printf("%d\n", a[i]);
}
return 0;
}
C
10*10二维数组存储
#include <stdio.h>
int main()
{
int layer,first=1,a[10][10],i,j;
scanf("%d", &layer);
a[0][0] = 1;
printf("%d \n", a[0][0]);
for (i = 1; i < layer; ++i) {
a[i][0] = 1;
a[i][i] = 1;
printf("%d ", a[i][0]);
for (j = 1; j < i / 2 + 1; ++j) {
a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
printf("%d ", a[i][j]);
}
for (j = i / 2 + 1; j < i; ++j) {
a[i][j] = a[i][i-j];
printf("%d ", a[i][j]);
}
printf("%d ", a[i][i]);
printf("\n");
}
return 0;
}
D
#include <stdio.h>
int main()
{
char a[10],c;
int i = 0,j;
while ((c = getchar()) != '\n') {
a[i] = c;
++i;
}
a[i] = '\0';
for (j = 0; j < i; ++j) {
if (a[j] >= 65 && a[j] <= 90) {
a[j] = 25 - (a[j]-65) +65;
}
else if(a[j] >= 97 && a[j] <= 122) {
a[j] = 25 - (a[j] - 97) +97;
}
}
printf("%s", a);
return 0;
}
E
gets()方法已经不被PAT编译器支持,用cin.getline
代替
#include <stdio.h>
#include<iostream>
using namespace std;
int main()
{
char s1[10],s2[10];
int i = 0,num=0;
cin.getline(s1,10);
cin.getline(s2, 10);
while (s1[i] != '\0' && s2[i] != '\0') {
if (s1[i] != s2[i]) {
num = s1[i] - s2[i];
break;
}
++i;
}
printf("%d", num);
return 0;
}
F
中间(偏左)下标为i/2
,i
为最后下标
#include <stdio.h>
int main()
{
int a[10],i,temp;
for (i = 0; i < 10; ++i) {
scanf("%d", &a[i]);
}
for (i = 0; i < 5; ++i) {
temp = a[i];
a[i] = a[9 - i];
a[9 - i] = temp;
}
for (i = 0; i < 10; ++i) {
printf("%d\n", a[i]);
}
return 0;
}
G
#include <stdio.h>
int main()
{
int f[20],i;
f[0] = f[1] = 1;
printf("%d\n%d\n", f[0],f[1]);
for (i = 2; i < 20; ++i) {
f[i] = f[i - 1] + f[i - 2];
printf("%d\n", f[i]);
}
return 0;
}
H
冒泡排序,n为排序个数
外层为排序趟数 n-1次 0<=i<n-1
内层为比较次数 0<=j<n-1-i
如没有交换,跳出循环,根据flag
#include <stdio.h>
int main()
{
int a[10],i,j,temp,flag=0;
for (i = 0; i < 10; ++i) {
scanf("%d", &a[i]);
}
for (i = 0; i < 9; ++i) {
flag = 0;
for (j = 0; j < 9 - i; ++j) {
if (a[j] > a[j + 1]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
flag = 1;
}
}
if (flag == 0) {
break;
}
}
for (i = 0; i < 10; ++i) {
printf("%d\n", a[i]);
}
return 0;
}
I
空格或换行是使scanf
结束一个输入
#include <stdio.h>
int main()
{
int a[2][3], b[3][2],i,j;
for (i = 0; i < 2; ++i) {
for (j = 0; j < 3; ++j) {
scanf("%d", &a[i][j]);
b[j][i] = a[i][j];
}
getchar();
}
for (i = 0; i < 3; ++i) {
for (j = 0; j < 2; ++j) {
printf("%d ", b[i][j]);
}
printf("\n");
}
return 0;
}
J
strcmp
函数
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int main()
{
char a[10], b[10], c[10];
int max = 0;
cin.getline(a, 10);
cin.getline(b, 10);
cin.getline(c, 10);
if (strcmp(a, b) < 0) {
max = 1;
if (strcmp(a, c) < 0) {
max = 2;
}
}
switch (max) {
case 0:printf("%s", a);
break;
case 1:printf("%s", b);
break;
case 2:printf("%s", b);
break;
}
return 0;
}
100000570
数组直接作为参数,函数可改变其内容
A
参数为数组或者指针形式都可 数组第一维个数可以不写
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
void strReverse(char a[10]) {
int i = 0,j;
char temp;
while (a[i] != '\0') {
++i;
}
for (j = 0; j < (i-1) / 2+1; ++j) {
temp = a[j];
a[j] = a[i-1 - j];
a[i-1 - j] = temp;
}
}
int main()
{
char a[10];
cin.getline(a, 10);
strReverse(a);
printf("%s", a);
return 0;
}
B
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
void vowels(char s1[], char s2[]) {
int i=0,j=0;
while (s1[i] != '\0') {
if (s1[i] == 'a' || s1[i] == 'e' || s1[i] == 'i' || s1[i] == 'o' || s1[i] == 'u' || s1[i] == 'A' || s1[i] == 'E' || s1[i] == 'I' || s1[i] == 'O' || s1[i] == 'U') {
s2[j] = s1[i];
++j;
}
++i;
}
s2[j] = '\0';
}
int main()
{
char a[10],b[10];
cin.getline(a, 10);
vowels(a, b);
printf("%s\n", b);
return 0;
}
100000571
A
malloc函数头文件<stdlib.h>
也可以int a,b int *p=&a,*q=&b
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* a=(int*)malloc(sizeof(int)),*b= (int*)malloc(sizeof(int)),temp;
scanf("%d %d", a, b);
if ((*b) > (*a)) {
temp = *a;
*a = *b;
*b = temp;
}
printf("%d %d", *a, *b);//*a<*b?*b:*a
return 0;
}
B
先对比前两个,再插入第三个
#include <stdio.h>
int main()
{
int a, b, c,temp, * p = &a, * q = &b, * r = &c;
scanf("%d %d %d", p,q,r);
if ((*p) < (*q)) {
temp = *p;
*p = *q;
*q = temp;
}
if ((*r) > (*q)) {
temp = *q;
*q = *r;
*r = temp;
if ((*q) > (*p)) {
temp = *p;
*p = *q;
*q = temp;
}
}
printf("%d %d %d\n", *p, *q,*r);//(*p>*q?*p:*q)>*r?(*p>*q?*p:*q):*r
return 0;
}
C
#include <stdio.h>
int main()
{
const char *a = "I love China!";
int n;
scanf("%d", &n);
printf("%s", a + n);
return 0;
}
D
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int main()
{
char a[20], b[20], c[20], * p=a, * q=b, * r=c,*temp;
cin.getline(a, 20);
cin.getline(b, 20);
cin.getline(c, 20);
if (strcmp(p, q)>0) {
p = b;
q = a;
}
if (strcmp(q, r) > 0) {
temp = q;
q = r;
r = temp;
if (strcmp(p, q) > 0) {
temp = q;
q = p;
p = temp;
}
}
printf("%s\n%s\n%s\n", p, q, r);
return 0;
}
E
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
void scanf10(int a[10]) {
int i;
for (i = 0; i < 10; ++i) {
scanf("%d", &a[i]);
}
}
void print10(int a[10]) {
int i;
for (i = 0; i < 10; ++i) {
printf("%d ", a[i]);
}
printf("\n");
}
void process10(int a[10]) {
int max = a[0], min = a[0],maxi=0,mini=0, i,temp;
for (i = 1; i < 10; ++i) {
if (max < a[i]) {
max = a[i];
maxi = i;
}
if (min > a[i]) {
min = a[i];
mini = i;
}
}
temp =a[9];
a[9]= a[maxi];
a[maxi] = temp;
temp = a[0];
a[0] = a[mini];
a[mini] = temp;
}
int main()
{
int a[10], * p = a;
scanf10(p);
process10(p);
print10(p);
return 0;
}