您的位置:首页 > 其它

POJ 1001(大数相乘)

2016-07-27 14:49 323 查看
POJ1001

题意:输入m,n 求m的n次方。

/*需要注意的点太多了,没事就多打几遍*/
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int point;
void ridzero(char a[])
{
int i;
i = strlen(a) - 1;
while(a[i] == '0'){
a[i] = '\0';
i--;
}
}
void ridpoint(char a[])
{
int i,length;
length = strlen(a);
for(i = 0;i < length; i++) //判断是否有小数点
if(a[i] == '.')
break;
if(i != length){
for(i = length - 1;i >= 1; i--) //记录小数点的位置
if(a[i] != '.') point ++;
else break;
if(a[0] == '0'){ //小数点有两种情况,一是0.0***的形式,去除小数点
for(i = 2;i < length; i++)
if(a[i] != '0'){
strcpy(a,&a[i]);
break;
}
}
else { //这是***.**的形式,去除小数点
int flag = 0;
for(i = 1;i < length - 1; i++){
if(a[i] == '.') flag = 1;
if(flag) a[i] = a[i + 1];
}
a[i] = '\0';
}
}
}
void multiplication(char a[],char b[])
{
int i,j,k,c[410] = {0},sum;
int l = strlen(a) + strlen(b);
for(i = strlen(b) - 1;i >= 0; i--)
for(j = strlen(a) - 1,k = i + j + 1;j >= 0; j--,k--){ //注意k的作用是把结果存入c[k],其大小要比计算的位数大一位
sum = (a[j] - '0') * (b[i] - '0') + c[k];
c[k] = sum % 10;
c[k - 1] += sum / 10;
}
for(i = c[0]?0:1,j = 0;i < l; i++, j++)
a[j] = c[i] + '0';
a[j] = '\0';
}
void show(char a[])
{
int i,length;
length = strlen(a);
if(point >= length){
printf(".");
for(i = point - length;i > 0; i--)
printf("0");
printf("%s\n",a);
}
else {
for(i = 0;i < length; i++)
if(length - point == i){
cout<<"."<<&a[i];
break;
}
else cout<<a[i];
cout<<endl;
}
}
int main()
{
int i,n;
char str1[210],str2[210];
while(cin>>str1>>n){
if(n == 0){
printf("1\n");
continue;
}
point = 0;
ridzero(str1); //去掉多余的零
ridpoint(str1); //去掉小数点
strcpy(str2,str1);
for(i = 1;i < n; i++)
multiplication(str1,str2); //核心算法,大数相乘
point *= n; //记录小数点的位置
show(str1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: