机试复习哈

目录

day1

day2

学会把数字反过来

day3

7问题

​编辑

约数问题

水仙花问题

day4

xxx问题

特殊乘法

day5

上面问题另解

上面问题优化

绩点问题

day6

day7

1.菱形

day8

1.叠筐问题

2.旋转矩阵

易错点


day1

打表法♥

做的题目:

例题(精做)

正式开始:

1.枚举:暴力法。

就是一个一个举例子,比如鸡兔同笼,直接鸡和兔子i,j,采用for循环即可

例题,abc那道题easy死了

2.常见错误

(1)编译错误:

(2)链接错误

(3)运行中错误:单步调试

①打断点②监视③单步调试

提高效率:增量编写法

day2

1.一开始问题:i从0开始,这就不满足四位数了

next错因:m赋值操作是一个=

2.对称平方数

不知道为啥k要从1开始

虽然但是简单的要死

#include<stdio.h>
using namespace std;
int main()
{
	int m = 0; int i = 0, j = 0;
	
for (int i = 0; i < 10; i++)
	for (int j = 0; j < 10; j++)
	{
		for (int k = 0; k < 10; k++)
		{
			if (i == 0 && j == 0 && k <= 3)
			{
				printf("%d\n", k);
			}
			m = (i * 100 + j*10+k) * (i * 100 + j * 10 + k);
			if (i * 100 + j * 10 + k <= 31 && m / 100 == m % 10)
			{
				printf("%d\n", i * 100 + j * 10 + k);
			}
			if (i * 100 + j * 10 + k > 31 && i * 100 + j * 10 + k <= 99 && m / 1000 == m % 10 && m / 100 % 10 == m % 100 / 10)
				printf("%d\n", i * 100 + j * 10 + k);
			if(i * 100 + j * 10 + k>99&& i * 100 + j * 10 + k<=256&&m/10000==m%10&&m%100/10==m/1000%10)
				printf("%d\n", i * 100 + j * 10 + k);
		}
	}
return 0;
}

今早痛经难受死我了,只学了一点

上面是笨蛋做法

学会把数字反过来

#include<stdio.h>
int reverse(int n)
{
	int rev = 0;
	while (n != 0)
	{
		rev *= 10;
		rev += n % 10;
		n /= 10;
	}
	return rev;
}
int main()
{
	for (int i = 0; i < 256; i++)
	{
		if (i*i == reverse(i*i))
			printf("%d\n", i);
	}
}

day3

7问题

约数问题

scanf别随便+空格

时间超过,如何改进?明天问老师

水仙花问题

总结:scanf和while判断(边界问题)

①scanf应该先写一个然后再将剩余的scanf写到while的末尾

②m和n的条件要写到while里面

③tag别忘了归零

day4

xxx问题

主要是当输入未知个数数字的时候如何输入

#include<stdio.h>
using namespace std;
// 对于一个数n,如果是偶数,就把n砍掉一半;
// 如果是奇数,把n变成 3*n+ 1后砍掉一半,直到该数变为1为止。     
// 请计算需要经过几步才能将n变到1,具体可见样例。
int main()
{
	int n;
	while (scanf_s("%d", &n) != EOF)//读取未知个数的数字
	{
		int count = 0;
		while (n != 1)
		{
			if (n % 2 == 0) {
				n /= 2; count++;
			}
			else if (n % 2 == 1) {
				n = (3 * n + 1) / 2; count++;
			}

		}
		printf("%d", count);
	}
	return 0;
}

特殊乘法

字符串代替

#include<iostream>//头文件忘了
using namespace std;
//用字符串的方式
int main()
{
    string a, b;
    long long c = 0;//long这个不会
    cin >> a >> b;//输入大于号
    for (long long i = 0; i < a.size(); i++) {//a的size
        for (long long j = 0; j < b.size(); j++) {
            c += (a[i] - '0') * (b[j] - '0');//字符串表示数据
        }
    }
    cout << c;
}

day5

上面问题另解

//另解
#include<iostream>
using namespace std;
int main()
{
    int x = 0, y = 0;
    cin >> x >> y;
    int s = y;
    int sum = 0;
    while (x)//对y和x分别做/10和%10操作
    {
        y = s;//很好地保留了y
        int p = x % 10;
        while (y)
        {
            int q = y % 10;
            sum += q * p;
            y /= 10;
        }
        x /= 10;
    }
    cout << sum;
}

上面问题优化

//先把y每一位求出来结果,因为x乘以它本身得到的结果就是它的和
#include<iostream>
using namespace std;
int main()
{
    int x, y, t;
    cin >> x >> y;
    t = y;
    int sum1 = 0;
    int sum2 = 0;
    while (y)
    {
        sum1 += y % 10;
        y /= 10;
    }
    while (x)
    {
        sum2 += (x % 10) * sum1;
        x /= 10;
    }
    cout << sum2;
}

绩点问题

妈的花了我那么久

首先输入数组有问题,其次丢了一个=

/*北京大学对本科生的成绩施行平均学分绩点制(GPA)。
既将学生的实际考分根据不同的学科的不同学分按一定的公式进行计算。
公式如下:
实际成绩     绩点 
90——100     4.0 
85——89      3.7 
82——84      3.3 
78——81      3.0 
75——77      2.7 
72——74      2.3 
68——71      2.0 
64——67      1.5 
60——63      1.0 
60以下        0
一门课程的学分绩点 = 该课绩点 × 该课学分
总评绩点 = 所有学科学分绩点之和 / 所有课程学分之和
现要求你编写程序求出某人 A 的总评绩点(GPA)。
输入格式
第一行,总的课程数 n;
第二行,相应课程的学分(两个学分间用空格隔开);
第三行,对应课程的实际得分;
此处输入的所有数字均为整数。
输出格式
输出有一行,总评绩点,精确到小数点后 2 位小数。
数据范围
1≤n≤10,
学分取值范围 [1,10],
课程得分范围 [0,100]。*/
#include<iostream>
#include<iomanip>
using namespace std;
#define max 100
int main()
{
	int n;
	cin >> n;
	int a[max], b[max]; //int p = 0, q = 0;//定义数组应该用max
	for(int p=0;p<n;p++)//输入的时候会告诉你n,别用while了
	{
		scanf_s("%d", &a[p]);
	}
	//cout << "\n" << "";//只能cout回车键
	for(int q=0;q<n;q++)
	{
		scanf_s("%d", &b[q]);
	}
	cout << "\n" << "";
	//cin >> a[max] >>"\n" >> b[max]>>"\n";
	float c[max];
	for (int i = 0; i < n; i++)
	{
		if (b[i] >= 90 && b[i] <= 100)c[i] = 4 * a[i];
		if (b[i] >= 85 && b[i] <= 89)c[i] = 3.7 * a[i];
		if (b[i] >= 82 && b[i] <= 84)c[i] = 3.3 * a[i];
		if (b[i] >= 78 && b[i] <= 81)c[i] = 3 * a[i];
		if (b[i] >= 75 && b[i] <= 77)c[i] = 2.7 * a[i];
		if (b[i] >= 72 && b[i] <= 74)c[i] = 2.3 * a[i];
		if (b[i] >= 68 && b[i] <= 71)c[i] = 2 * a[i];
		if (b[i] >= 64 && b[i] <= 67)c[i] = 1.5 * a[i];
		if (b[i] >= 60 && b[i] <= 63)c[i] = 1 * a[i];
		if (b[i] < 60)c[i] = 0;//妈的多了个等于号
	}
	float sum = 0; float sum1 = 0;
	for (int j = 0; j < n; j++)
	{
		sum += c[j];
	}
	for (int k = 0; k < n; k++)sum1 += a[k];
	sum = sum / sum1;
	cout << setprecision(2) << fixed << sum << endl;//如何输出小数点后两位数
}

day6

1.买房子

#include<iostream>
#include<numeric>
#include<cmath>
using namespace std;
int main()
{
    int n, k;
    //cin >> n >> k;
    int i = 0;//返回第i+1年
    double m = 0;
    m = 200;//m是房子的价格
    while (scanf_s("%d%d", &n, &k) != EOF)
    {
        m = 200;
        i = 0;
        while ((i + 1) * n <= m) {
            i++;
            m = 200 * pow(1 + k * 0.01, i);//m是房子的价格
            if (i >= 21) break;
        }
        // cout<<1;

        if (i + 1 > 21)cout << "Impossible\n";
        else cout << i + 1 << "\n";
    }
    return 0;
    /*C++提供以下几种pow函数的重载形式;
     double pow(double X,int Y);
     float pow(float X,float Y);
     float pow(float X,int Y);
     long double pow(long double X,long double Y);
     long double pow(long double X,int Y);
    */

}

day7

1.菱形

1.先上结果

换一下

2.思路:

简单来说是for循环,两个for循环,每个for循环里嵌套着3个for循环

①如何定义一个赋初值的数组:(以下两种方法)

char str[1000]={0};

memset(str,1000,0);//实际上就是清空的操作

②要打印很多行就要让每一行成为一个数组,给数组赋值

例如:str[i]=' ';即就是给数组赋空格 

for循环之前就定义好i变量,以便于for循环之后还可以用int,而且不会重定义。

定义一个变量就写好它的用途,例如本题中i:定义几行;j:定义每一行的内容

④图中定义数组内容:比如想要0 1 2 3 4,就用‘0’+j;想要2 3 4 5 6,就用‘2’+j;

⑤图案分解成字符串数组

3.代码

int main() {
    int n;
    scanf_s("%d", &n);
    char str[1000];
    int k = n; int s;
    int i; int j;//对于每一行的变量用j
    for (int i = 0; i <= n; i++)//列数
    {
        memset(str, 0, 1000);
        for (j = 0; j < 2 * (k-i); j++)//k到后面会--
        {
            str[j] = ' ';
            //printf(" ");
        }//为什么一直打印不出来//因为你没有给str赋值!!!!!!!!!!!!!!!!!
        //打了2k个空格
        for (int s = 0; s <= i; s++)
        {
            str[j] = '0' + s;
            str[j + 1] = ' ';
            j = j + 2;
        }
        for (int w = i-1; w >= 0; w--)
        {
            str[j] = '0' + w;
            str[j + 1] = ' ';
            j = j + 2;
        }
        cout << str << '\n';
    }
    for (i = n - 1; i >= 0; i--)
    {
        memset(str, 0, 1000);
        for (j = 0; j < 2 * (n-i); j++)
        {
            str[j] = ' ';
        }
        for (k = 0; k <= i; k++)
        {
            str[j] = '0' + k;
            str[j + 1] = ' ';
            j = j + 2;
        }
        for (s = i - 1; s >= 0; s--)
        {
            str[j] = '0' + s;
            str[j + 1] = ' ';
            j = j + 2;
        }
        cout << str<<'\n';
    }
}

4.错误原因:打每一行的空格的时候应该给str赋值,而不是cout<<' ';

如果是二维数组去打印的话,思路是一样的,但是没做对

day8

1.叠筐问题

(1)他的思路:一圈一圈打印,用二维数组;中心:(n/2,n/2);每个正方形的四个顶点的坐标变化

可是怎样转化为代码

2.很多问题:

(1)scanf中char类型用%c表示

        //注意:%c,不忽略空格,所以在%c之前要写空格

(2)多个输入未知个数时候:!=EOF

(3)每次输入完成要清空

(4)如何打印二维数组:

一个for循环,输出%s,即字符串,字符串的内容是arr[i];

注意二维数组下标是n-1还是n,最好是带入

3.代码(搞了一下午)

/*Problem Description
需要的时候,就把一个个大小差一圈的筐叠上去,使得从上往下看时,
边筐花色交错。这个工作现在要让计算机来完成,得看你的了。
Input
输入是一个个的三元组,分别是,外筐尺寸n(n为满足0<n<80的奇整数),
中心花色字符,外筐花色字符,后二者都为ASCII可见字符;
Output
输出叠在一起的筐图案,中心花色与外筐花色字符从内层起交错相叠,
多筐相叠时,最外筐的角总是被打磨掉。叠筐与叠筐之间应有一行间隔。*/
/*
 AAAAAAAAA 
ABBBBBBBBBA
ABAAAAAAABA
ABABBBBBABA
ABABAAABABA
ABABABABABA
ABABAAABABA
ABABBBBBABA
ABAAAAAAABA
ABBBBBBBBBA
 AAAAAAAAA 
 */
#include<stdio.h>
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	char arr[100][100] = { 0 };//用二维数组
	int n; char in, out;
	//cin >> n>>in>>out;
	//int m = n / 2;//最中心的位置
	char color;//大失误
	while (scanf("%d %c %c", &n, &in, &out) != EOF)//刚刚写错了,因为char是%c,
		//注意:%c,不忽略空格,所以在%c之前要写空格
	{
		memset(arr, 0, 10000);//每次输入都要清空
		int layer; int j; int i;
		//每个坐标 居中 左上 右上 左下 右下 
		//n/2 n/2
		//n/2-layer n/2-layer
		//n/2-layer n/2+layer
		//n/2+layer n/2-layer
		//n/2+layer n/2+layer
		//所以我还是不知道咋填充
		color = in;
		for (layer = 0; layer <= n / 2; layer++)//一层一层涂
		{//正方形一个边一个边涂
			for (i = n / 2 - layer; i <= n / 2 + layer; i++)//上
			{
				j = n / 2 - layer;
				arr[i][j] = color;//不知道咋样让j不动
			}
			for (i = n / 2 - layer; i <= n / 2 + layer; i++)//下
			{
				j = n / 2 + layer;
				arr[i][j] = color;//不知道咋样让j不动
			}
			for (j = n / 2 - layer; j <= n / 2 + layer; j++)//左
			{
				i = n / 2 - layer;
				arr[i][j] = color;//不知道咋样让j不动
			}
			for (j = n / 2 - layer; j <= n / 2 + layer; j++)//右
			{
				i = n / 2 + layer;
				arr[i][j] = color;//不知道咋样让j不动
			}
			if (color == in)color = out;//如何换颜色//刚刚忘记变成赋值操作了
			else color = in;
		}
		arr[0][0] = ' '; arr[n-1][n-1] = ' '; arr[0][n-1] = ' '; arr[n-1][0] = ' ';
	for (int k = 0; k < n; k++)//如何打印二维数组
	{
		printf("%s\n", arr[k]);//打印一行字符串%s
	}
	}
	//cout << arr;//不能这样打印
	
}

4.展示结果:

2.旋转矩阵

(1)二维数组如何传参

​​​​​​http://t.csdnimg.cn/GswFS

void fun(int **array, int n, int m)

用的时候:fun(p,m,n)

(2)在int  main前面就定义好n变量,是为了所有的函数都可以用n

(3)如何输入一个矩阵?

for(int i=0;i<n;i++)

   for(int j=0;j<b;j++)

      cin>>a[i][j];

(4)如何实现图形的旋转?方法:用t[][]去保存变换之后的,然后付给b

for (j = 0; j < n; j++)♥
            for (i = n - 1; i >= 0; i--)
                t[j][n - 1 - i] = a[i][j];
        for (i = 0; i < n; i++)
            for (j = 0; j < n; j++)
                a[i][j] = t[i][j];

/*任意输入两个9阶以下矩阵,要求判断第二个是否是第一个的旋转矩阵(顺时针),如果是,输出旋转角度(0、90、180、270
),如果不是,输出 −1。
输入格式
第一行包含整数 n,表示矩阵阶数。接下来n 行,每行包含 n个空格隔开的整数,表示第一个矩阵。
再接下来 n行,每行包含 n个空格隔开的整数,表示第二个矩阵。
输出格式
判断第二个矩阵是否是第一个的旋转矩阵,如果是,输出旋转角度(0、90、180、270),如果不是,输出 −1
如果旋转角度的结果有多个,则输出最小的那个。
数据范
1≤n≤9;矩阵中元素取值范围 [1,9]
输入样例:
3
1 2 3
4 5 6
7 8 9
7 4 1
8 5 2
9 6 3
输出样例:
90*/
//思路:把每一个角度会得到的结果都列出来,二维数组,然后if判断,符合条件即为所求
#include<stdio.h>
#include<iostream>
using namespace std;
int a[10][10], b[10][10], t[10][10];//t用来存放旋转后的90度,把b旋转90度后和a比较
int n;//写在这里是全局变量的意思吗♥
int isequal(int a[][10], int b[][10])//如何写二维数组♥
{
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
		     if (a[i][j] != b[i][j])return 0;
			return 1;
		//相同输出1
}
int main()
{
	//怎样把这两个矩阵输入?♥
	 cin >> n; int i, j;
    for (i = 0; i < n; i++)//下面把两个矩阵输入,用两个for循环//下一次要回输入
        for (j = 0; j < n; j++)
            cin >> a[i][j];
	for (i = 0; i < n; i++)
		for (j = 0; j < n; j++)
			cin >> b[i][j];
	int d[4] = { 0,90,180,270 };
	for (int ii = 0; ii < 4; ii++)
	{
		if (isequal(a, b) == 1)
		{
			cout << d[ii]; return 0;
		}
		for (j = 0; j < n; j++)♥
			for (i = n - 1; i >= 0; i--)
				t[j][n - 1 - i] = a[i][j];
		for (i = 0; i < n; i++)
            for (j = 0; j < n; j++)
				a[i][j] = t[i][j];
	}
	cout << -1;
	return 0;
}

易错点

1.如何输入未知个数的数据

while(scanf("%d",&m)!=EOF)

2.a的b此法:pow(a,b)

3.C语言记录字符串会多记录一个,\0

字符串自己写的时候空间越大越好

防止少写\0,可以初始化

①char str[100]

②include<string.h.

memset(str,0,100)//100是个,赋初值都是0,相当于清空操作

4.‘0’未必是真的在字符里用0表示

5.想打印空格,别cout,给str赋空值

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值