算法练习3
平方函数:
pow(x,y);//即x的y次方新建动态数组
cin>>len;
int *p=new int[len];
- 新建线性链表:
#include<iostream.h>
struct student
{
int number; //数据域(学号)
struct student *next;//指针域(地址)
};
void main()
{
//定义三个独立的学生,学号1、2、3
struct student stu1,stu2,stu3;
stu1.number=1;
stu2.number=2;
stu3.number=3;
cout<<stu1.number<<" "<<stu2.number<<" "<<stu3.number<<endl;
//把三个学号的存储地址连起来,就构成了链表
struct student *head; //头指针
head=&stu1;
stu1.next=&stu2;
stu2.next=&stu3;
stu3.next=NULL;
//构成链表后,可以连续输出3个学号
while(head != NULL)
{
cout<<head->number;
head=head->next;
}
}
求解思路:
- 求利用数组保存住n的每一位数,利用除以10取余的到最低位的数值,然后在取整继续除以10取余.
- 也有些人用的堆栈来储存数值.
- 利用lg 计算n的位数
高手的思路:
将n强制转换成string格式,然后每一个数的acll值减去’0’的acll值便还原成数值形式.我的最后的代码:
#include<iostream>
using namespace std;
class DigPow
{
public:
static int digPow(int n, int p)
{
int bit=0;
int *value = new int[5];
int copyN = n;
while (1)
{
bit++;
int pow10 = pow(10, 1);
value[bit-1]=copyN % pow10;
cout << value[bit - 1] << endl;
if (copyN<10)
{
break;
}
copyN = copyN / pow10;
cout << "copyN" << copyN << endl;
}
int restoredNumber = 0;
for (int i = 0; i < bit; i++)
{
restoredNumber += pow(value[i],(bit+p-1-i));
cout << restoredNumber << endl;
}
return restoredNumber %n == 0 ? restoredNumber / n
: -1;
};
};
- 高手的代码:
#include <string>
#include <cmath>
class DigPow
{
public:
static int digPow(int n, int p);
};
int DigPow::digPow(int n, int p)
{
long long s = 0;
std::string nstr = std::to_string(n);
for (unsigned int i = 0; i < nstr.length(); i++)
s += static_cast<long long>(std::pow(static_cast<int>(nstr[i] - '0'), p + i));
if (s % n == 0)
return s / n;
else
return -1;
}