第二次作业

  目前学习过程中薄弱的就是指针那一块。

  在程序中向计算机申请一个变量(如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;

}

  核心在于理解辗转相除法的计算原理。

posted @ 2018-12-07 20:59  xeosys  阅读(114)  评论(0编辑  收藏  举报