站长网 大数据 HDU 1042(高精度)(大数)(万进制)

HDU 1042(高精度)(大数)(万进制)

? 这个是高精度问题,要用数组解决,核心思想:用数组储存数值,将每个数组元素当成“大数”一位数,如果元素值大于9999,则要进位,进位的值为元素值%10000;这也可以理解为一个“万进制”,可以存储的值,就相当于十进制的每一位从0~10变成了0~9999,就

? 这个是高精度问题,要用数组解决,核心思想:用数组储存数值,将每个数组元素当成“大数”一位数,如果元素值大于9999,则要进位,进位的值为元素值%10000;这也可以理解为一个“万进制”,可以存储的值,就相当于十进制的每一位从0~10变成了0~9999,就等同于从十进制变成了万进制。

????????? 举例(参考的别人的博客):? a[0]=4372,a[1]=792,a[2]=1。107924372,从低位到高位每四位存到一个数组元素中。此时,总位数为3。

?????????????? 乘15,a[0]*15=65580,所以进位为a[0]/10000=6,a[0]=a[0]%10000=5580。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? a[1]*15=11880,a[1]=a[1]+6=11886。

??????????????????????????????????????????????????????????????????????????? 进位为1,a[1]=1886。a[2]*15=15,a[2]=a[2]+1=16,进位为0。

???????????????输出:a[2],a[1],a[0]即为1618865580。要注意的是:如果a[1]=886,那么该如何输出?直接输出:168865580。显然不对,

????????????????????????? 正确的是16088655880。输出的原则是:最高位原样输出,其它位如果小于1000,则高位补0,一位一补。

#include<iostream>
#include<iomanip>
using namespace std;
void System(int n);//用函数实现,有利于重复利用
int main()
{
??? int n;
??? while(cin>>n)
??? {
??????? System(n);
??? }
??? return 0;
}
void System(int n)
{
??? int a[10005]={1};//用数组来存储万进制的每一位
??? int i,j;
??? int places=0,carry;//总位数,进位的值
??? for(i=1;i<=n;i++)
??? {
??????? carry=0;
??????? for(j=0;j<=places;j++)
??????? {
??????????? a[j]=a[j]*i+carry;
??????????? carry=a[j]/10000;
??????????? a[j]%=10000;
??????? }
??????? if(carry!=0)
??????? {
??????????? places++;
??????????? a[places]=carry;
??????? }
??? }

??? cout<<a[places];//最高位原样输出
??? for(i=places-1;i>=0;i--)//其他位小于1000的,高位补0
??????? cout<<setw(4)<<setfill('0')<<a[i];
??? cout<<endl;
}

本文来自网络,不代表站长网立场,转载请注明出处:https://www.zwzz.com.cn/html/shuju/2021/0526/6833.html

作者: dawei

【声明】:站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。
联系我们

联系我们

0577-28828765

在线咨询: QQ交谈

邮箱: xwei067@foxmail.com

工作时间:周一至周五,9:00-17:30,节假日休息

返回顶部