C++高精度计算二(练习题)
数位和计算
【描述】输入一个大数,将该大数中的各位数字之和相加输出
【输入描述】一个大数A
【输出描述】计算各位数字之和,然后输出结果
【样例输入】
123456789
【样例输出】
45
#include<iostream>#include<cstring>usingnamespacestd;constintMAX=1005;chara[MAX];intdigitSum(){intsum=0;for(inti=0;a[i];i++){sum+=a[i]-'0';}returnsum;}intmain(){cin>>a;cout<<digitSum()<<endl;return0;}/* 【输入用例2】 1000000000000000000000 【输出用例2】 1 【输入用例3】 9999999999999999999999999999999 【输出用例3】 279 【输入用例4】 00000000000000000000000007 【输出用例4】 7 【输入用例5】 2025 【输出用例5】 9 【输入用例6】 1111111111111111111111111111 【输出用例6】 28 */连续除法
【描述】设计一个程序,能够计算一个大数连续除于n个数的结果,需要注意的是,除的过程中可能会出现小数部分,所以每次除的结果只保留整数部分,舍去小数部分即可。
【输入描述】第一行:大数A,第二行:除数个数n,接下来n行:n个除数
【输出描述】连续除完后的结果
【输入样例】
1000
3
2 5 10
【输出样例】
10
#include<iostream>#include<string>usingnamespacestd;// 高精度除以单精度函数(处理字符串形式的大数)stringdivideString(conststring÷nd,intdivisor){string quotient;intremainder=0;for(charc:dividend){intcurrent=remainder*10+(c-'0');// 当前余数拼接当前位quotient+=(current/divisor)+'0';// 计算商位remainder=current%divisor;// 更新余数}// 去除前导零size_t start=quotient.find_first_not_of('0');return(start==string::npos)?"0":quotient.substr(start);}intmain(){string A;intn;// 输入处理cin>>A>>n;for(inti=0;i<n;++i){intdivisor;cin>>divisor;// 连续除法处理A=divideString(A,divisor);if(A=="0")break;// 提前终止优化}cout<<A<<endl;return0;}/* 【输入用例2】 5 1 1 【输出用例2】 5 【输入用例3】 100 2 10 10 【输出用例3】 1 【输入用例4】 0 1 5 【输出用例4】 0 【输入用例5】 2560144019201080 10 2 2 2 2 2 2 2 2 2 2 【输出用例5】 2500140643751 【输入用例6】 9999999999999999999999 9 9 9 9 9 9 9 9 9 9 【输出用例6】 25811747917131 */数的次方
【描述】计任意给定一个正整数 n (n<=100) ,计算 2的n次方的值。
【输入】输入一个正整数 n。
【输出】输出2的 n 次方的值。
【输入样例1】
5
【输出样例1】
32
【输入样例2】
100
【输出样例2】
1267650600228229401496703205376
#include<iostream>usingnamespacestd;#defineMAXN160inta[MAXN]={0};intn;intmain(){cin>>n;a[0]=1;for(inti=1;i<=n;i++){intup=0;// 进位初始为0for(intj=0;j<MAXN;j++){// 从个位到最高位,处理进位intt=a[j]*2+up;// 逐位*2 + 进位a[j]=t%10;// 保存个位up=t/10;// 留下进位部分}}inti=MAXN-1;while(a[i]==0)// 去前导0i--;while(i>=0)// 输出商cout<<a[i--];return0;}/* 【输入用例2】 20 【输出用例2】 1048576 【输入用例3】 50 【输出用例3】 1125899906842624 【输入用例4】 80 【输出用例4】 1208925819614629174706176 【输入用例5】 120 【输出用例5】 1329227995784915872903807060280344576 【输入用例6】 150 【输出用例6】 1427247692705959881058285969449495136382746624 */大数进制转换
【描述】输入一个10进制大数,将它转换成对应的进制表示
【输入描述】输入为两个数,第一个数是需要转换的大数,第二个数是需要转换的进制(进制要求在2-16之间)
【输出描述】输出转换后的进制表示数
【样例输入】
1024 2
【样例输出】
10000000000
#include<iostream>#include<cstring>usingnamespacestd;// 定义最大输入长度(含符号位)constintMAX=1005;charnum[MAX],res[MAX];// num存储输入数字,res存储转换结果intbase;// 目标进制chardigits[]="0123456789ABCDEF";// 将十进制字符串转换为指定进制并输出voidconvert(){intlen=strlen(num);longlongdecimal=0;// 中间十进制值// 将输入字符串转换为十进制数值for(inti=0;i<len;i++){decimal=decimal*10+(num[i]-'0');// 逐位计算十进制值}intindex=0;// 结果数组索引// 将十进制值转换为目标进制while(decimal>0){res[index++]=digits[decimal%base];// 根据余数选择字符decimal/=base;// 整除更新值}res[index]='\0';// 字符串结束符// 逆序输出结果(因转换时低位在前)for(inti=index-1;i>=0;i--)cout<<res[i];cout<<endl;}intmain(){cin>>num>>base;// 输入数字字符串和目标进制convert();// 执行转换return0;}/* 【输入用例2】 1024 16 【输出用例2】 400 【输入用例3】 999999 2 【输出用例3】 11110100001000111111 【输入用例4】 99999999 8 【输出用例4】 575360377 【输入用例5】 255 16 【输出用例5】 FF 【输入用例6】 2025202420232022 16 【输出用例6】 731E92EDB2F56 */