第二次作业
目前学习过程中薄弱的就是指针那一块。
在程序中向计算机申请一个变量(如int a),计算机会分配给你的变量一个空间。用int a举例子,计算机就给你了一个名叫a的房子,只能在里面放int类型的值。当然,你可以直接写a=10,这样计算机会帮你找到名叫a的房子,把10放进去。
那么这个房子在哪呢?就有了地址,每个变量都会有一个地址(即它在内存中的位置),指针,便是一根棍子,指着这个位置,指针里存的就是这个地址。
举例:
#include <iostream>
using namespace std;
int main(){
int a[2]={261,0};
int *pi=a;
char *p=(char *)pi;
cout<<*(int*)p++<<endl;
cout<<*(int*)p<<endl;
cout<<(int)*p<<endl;
cout<<(int)*(char*)pi<<endl;
return 0;
}
输出为:
261
1
1
5
我认为比较难的题:PTAcpp练习七编程题第一题。
题目大意:用辗转相除法求两个整数的最大公约数。
解题思路:
m | n | r=m%n |
12 | 5 | 2 |
5 | 2 | 1 |
2 | 1 | 0 |
如表所示,求正整数m,n的最大公约数,可以用辗转相除法求解,首先根据r=m%n得到,
(1)若r1!=0,则r2 = n % r1;
(2)若r2!=0,则r3 = r1 % r2;
(3)若余数始终不为0,辗转相除,顾名思义,以此类推,直至被整除
while(r!=0)
(
m=n;
n=r;
r=m%n;
)
代码呈现:
#include<iostream>
using namespace std;
int gcd(int &x,int &y)
{cout<<"gcd("<<x<<","<<y<<") ";
int r;
if(x > y){
while((r=x%y)!=0) {
x=y;
y=r;
cout<<"gcd("<<x<<","<<y<<") ";
}
}
else {int temp;
temp = x;
x=y;
y=temp;
cout<<"gcd("<<x<<","<<y<<") ";
while((r=x%y)!=0) {
x=y;
y=r;
cout<<"gcd("<<x<<","<<y<<") ";
}
}
}
int main()
{
int x,y;
cin>>x>>y;
gcd(x,y);
cout<<y<<endl;
return 0;
}
核心在于理解辗转相除法的计算原理。