总之就是 | 高精度丨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
暂未统计字数

posted @ 2021-01-29 16:44  HerikoDeltana  阅读(137)  评论(2编辑  收藏  举报