hdu1047
【求和】hdu1047
多组输入的处理以及大数的相加运算
while(true) 的存在使得可以以0结束一次的相加
大数位数相加,从高位开始相加,倒序存储方便后续处理成整数输出
这种类型高精度的题目在正式的比赛中至少遇到过两次
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int sum[150];
char in[150];//存入大数
int main()
{
int t;
cin>>t;
while(t--)
{
memset(sum,0,sizeof(sum));
while(true)
{
cin>>in;
if(strcmp(in,"0")==0)
break;
int l=strlen(in);
int i=l-1;
//把大数值叠加到总和上
for(int j=i; j>=0; j--)
{
sum[i-j]+=in[j]-'0';
}
}
int c=0;
for(int i=0; i<105; i++)
{
int s=c+sum[i];//C的意思是超过十加到下一位上
c=s/10;
sum[i]=s%10;
}
int ii;
for(ii=105; ii>=0; ii--)
if(sum[ii]!=0)
break;
//cout<<ii<<endl;
for(; ii>0; ii--)
{
cout<<sum[ii];
}
cout<<sum[0]<<endl;
if(t>0) cout<<endl;
}
return 0;
}
【实数的高精度幂】hdu1063
(Java实现确实很方便)
对于Float,Double,不能准确计算精度。而BigDecimal类就可以,用来对超过16位有效位的数进行精确运算。
charAt(int x)返回索引位置的char值
subString(int)只有一个参数时,是指从指定位置开始一直截取到字符串末尾
package gaojijngdu1;
import java.math.BigDecimal;
import java.util.Scanner;
public class gaojingdu1 {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
while(cin.hasNext())
{
BigDecimal a;
a=cin.nextBigDecimal();
int n=cin.nextInt();
a=a.pow(n);
a=a.stripTrailingZeros();//去后缀零
String s=a.toPlainString();//转为普通字符串
if(s.charAt(0)=='0')//前导零去掉
{
s=s.substring(1);
}
System.out.println(s);
}
cin.close();
}
}
【大数比较,斐波那契数】hdu1316
BigInteger大整型数
BigDecimal大浮点型
compareTo()比较函数:
String a=“abc”;
String b=“abc”
两个字符串比较,返回第一个不同字符的ASCII差值,int类型
当字符相同,则比较长度,例如
String a=“a”;
String b=“abc”;
则,返回-2
a.compareTo(BigInteger.ZERO)和0比较:
相等时返回值为0,大于返回值为1,小于返回值为-1
package gaojingdu2;
import java.math.BigInteger;
import java.util.Scanner;
public class gaojingdu22 {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
BigInteger[] f=new BigInteger[1000];
f[1]=new BigInteger("1");//调用构造函数
f[2]=new BigInteger("2");//调用构造函数
for(int i=3;i<f.length;i++)
{
f[i]=f[i-1].add(f[i-2]);
}
while(cin.hasNext())
{
BigInteger a=cin.nextBigInteger();
BigInteger b=cin.nextBigInteger();
int s=0;
if(a.compareTo(BigInteger.ZERO)==0&&b.compareTo(BigInteger.ZERO)==0)
break;
for(int j=1;j<f.length;j++)
{
if(a.compareTo(f[j])<=0&&b.compareTo(f[j])>=0)
s++;
if(b.compareTo(f[j])<0) break;
}
System.out.println(s);
}
}
}