总之就是 | 高精度丨Pt.Two
2021.2.6修改:
统一了题解题目格式
一看就是高精度,毕竟大整数
先看题
题目描述
任意给定一个正整数N(N≤100),计算2的n次方的值。
输入
输入一个正整数N。
输出
输出2的N次方的值。
输入样例
5
输出样例
32
实际上我最初是有那么一点慌的,因为昨天并没有学高精除
不过还是着手去分析,按照昨天的思路(昨天的笔记)
还是从列竖式来看
这里就不再演示了,大家都会
解法
思路
我先举了个例子:
1234/2=617
每一位 | 商 | 余数 |
---|---|---|
1 | 0 | 1 |
2+(上位余数)1×10 =12 | 6 | 0 |
3 | 1 | 1 |
4+10×1=14 | 7 | 0 |
通过观察这个例子,就可以发现: | ||
本质就是一位一位的去除,得出商和余数 | ||
根据这道题的特殊性,商就不用讨论了,可以只看余数 | ||
那么决定是否是因数的条件就是整除,而整除只需要最后的余数为0就可 |
那么最后判断的时候只需要考虑最后的余数
代码实现:
(略长,害怕自己看不懂加了注释)
for(int p=2;p<=9;p++)
{
for(int u=1;u<=len;u++)
{
int flash=b[u]+10*x;//当前除数=本位数+上次余数*10
x=flash%p;//计算余数
//cout<<"f="<<flash<<" x="<<x<<endl;测试数据用的
}
if(x==0)//若最后余数等于零,那么可以整除,输出p
{
cout<<p<<" ";
k++;
//计数器++
}
x=0;//余数一定要清零,刚才出错就是这里
//cout<<" "<<endl;这个是测试数据用的
}
那么这些完成之后就只用考虑计算顺序,这里我选择的是顺序计算,逆序也是可以的
上代码
(这里我去0那一步好像去掉也可以,强迫症)
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int a[31],b[31],sum;//声明存这个数要用的数组
int main()
{
char c[31];//声明字符串来存入
gets(c);
int len=strlen(c);
for(int i=0;i<len;i++)
{
a[len-i]=c[i]-'0';
}
//输入并转存
while(a[len]==0)
{
len--;
}
//去掉0
for(int i=0;i<len;i++)
{
b[len-i]=a[i+1];
}
//再正向存回去
for(int i=1;i<=len;i++)
{
sum+=b[i];
}
//计算一下和
int x=0,k=0;
for(int p=2;p<=9;p++)
{
for(int u=1;u<=len;u++)
{
int flash=b[u]+10*x;//当前除数=本位数+上次余数*10
x=flash%p;//计算余数
//cout<<"f="<<flash<<" x="<<x<<endl;测试数据用的
}
if(x==0)//若最后余数等于零,那么可以整除,输出p
{
cout<<p<<" ";
k++;
//计数器++
}
x=0;//余数一定要清零,刚才出错就是这里
//cout<<" "<<endl;这个是测试数据用的
}
if(k==0)
cout<<"none";//若计数器为0,说明2~9没有能整除这个数的数,输出none
return 0;
}
注释还是挺多的,原因同上。
反思与总结
题解已经结束,这里是笔记部分
本次做出这道题很顺利,一次AC,(当然最一开始出了点问题,不过问题不大)
这告诉我们做题前分析的重要性,之前太莽了,直接上,导致做完若是没有一遍过都不知道怎么改
End
2021.1.29
暂未统计字数
Do you like WHAT YOU SEE ?